0

我目前正在学习C++,这次我在搞指针,研究this指针和多态。我的问题是,下面的转换是否安全,我知道基本上我可以m_uConnectedUsersCUser课堂上直接访问,因为“公共”,但我可能会找到需要它的场合,我想知道你们专业人士的意见它。

#include <windows.h>
#include <iostream>

using namespace std;


class CUserCounter
{
public:
    CUserCounter();
    virtual ~CUserCounter(){};

    BOOL m_bEmpty;
    u_long m_uConnectedUsers;
};

CUserCounter::CUserCounter()
{
    m_bEmpty = TRUE;
    m_uConnectedUsers = 0;
}

class CUser : public CUserCounter
{
public:
    CUser(LPCTSTR szName, BOOL bConnected, BOOL bChatting = FALSE );
    virtual ~CUser(){};

    BOOL m_bConnected;
    BOOL m_bIsChatting;
    TCHAR szCharName[32];

    bool IncreaseMoverMeter( unsigned uMeters );
};

CUser::CUser( LPCTSTR szName, BOOL bConnected, BOOL bChatting )
{
    if( szName )
    {
        if( strlen( szName ) > 30 )
            strcpy( szCharName, "Invalid" );
        else
            strcpy( szCharName, szName );
    }
    m_bConnected = bConnected;
    m_bIsChatting = bChatting;
}

bool CUser::IncreaseMoverMeter( unsigned uMeters )
{
    //is it safe? how does it works
    CUserCounter* pUserCounter = (CUserCounter*)this;
    if( pUserCounter )
    {
        pUserCounter->m_uConnectedUsers++;
        return true;
    }
    return false;
}


int main( int argc, char *argv[] )
{             
    CUser *pUser = new CUser( "Jonh", FALSE );
    std::cout << pUser->IncreaseMoverMeter( 4 );

    system("pause>nul");
    return EXIT_SUCCESS;
}
4

4 回答 4

6

是的,它是安全的,但也没有必要。:)

转换是隐式的,因此无需强制转换。

CUser 是 a CUserCounter(至少在您的设计中),因此指向 aCUser的指针也是指向 a 的指针CUserCounter

于 2012-06-15T21:59:16.977 回答
3

我想讨论一个比问题中明确提出的问题更大的问题。

您有从 CUserCounter 派生的 CUser。这似乎是一个错误,因为用户不是计数器。在这种情况下,您应该有一个has-a关系 - CUser 对象应该包含一个 CUserCounter 对象,而不是一个。

为了回答这个问题,派生类可以访问它想要的基类的任何成员。不需要铸造,事实上铸造可以隐藏一些讨厌的问题 - 除非绝对必要,否则避免它。

于 2012-06-15T22:02:15.500 回答
2

通常不建议将成员变量公开。而是将它们设为私有并提供公共 getter 和/或 setter 方法。

如果您必须从派生类访问变量,请使其受保护

这样做的原因是成员变量表示对象的状态,不建议允许直接修改,因为它允许以破坏类的底层逻辑的方式更改状态(想想 String 类:如果你可以直接修改保存字符串大小缓存的变量,如果字符数组也没有相应地重新调整大小,这可能会对对象的进一步使用造成严重影响)

至于this指针:在大多数情况下,您不需要显式使用它,它的使用可以从上下文中推断出来。但是,如果您在同名的成员函数中有一个成员变量和一个参数,则该参数将隐藏该成员变量,您必须使用this它才能访问它。(当派生类的成员函数隐藏父类的函数声明时,也会产生类似的效果)

您也可以通过 访问类父类的受保护成员和公共成员this,但如上所述,您通常不需要使用它。此外,在这些情况下不需要转换为(指向)父类型的

于 2012-06-15T22:01:06.660 回答
0

在我看来,这种转换不仅是不必要的,而且是不雅的。正如有人所说,很明显,如果你从某个类继承,你就有一些可用的字段/方法。您不仅编写了一些不必要的代码,而且还使您的方法的可读性降低并且更难以维护。编译器可能会优化此类代码并删除额外的指令,因此可能没有效率成本(但这只是我的假设)。我坚信,当您认为this有必要进行转换时,您很可能应该再次重新考虑您的实施。

于 2012-06-15T22:15:12.797 回答