基类和派生类构造函数在C++中调用

Base class and derived class constructors calling in C++

本文关键字:C++ 调用 构造函数 派生 基类      更新时间:2023-10-16
#define DECLARE_NEWMSG(ClassName,ClassID)                
static ClassName* FromMsg(ClassA* psg)               
{                                                       
   return dynamic_cast<ClassName*>(psg);              
}                                                       
static ClassA* newMsg()                            
{                                                       
   return new ClassName;                               
}                                                       
enum {ID = ClassID};
GET_EVENT = 0x41,
typedef ClassA* (*pNewMsg)(void); //function pointer
typedef struct
{
    int         Id;       
    CString     Ascii;       
    pNewMsg    MessageFunc;    //calls new for the particular message
} stStruct;
ClassA
{
//stmts;
};
ClassA::ClassA(int Id,pNewMsg newMsg,const char* Ascii,void* Data,size_t DataSize)
{
    initialises all the variables;
}   
class GetEvent : public ClassA
{
public:
    DECLARE_NEWMSG(GetEvent,GET_EVENT);
    GetEvent();
};

static const GetEvent cGetEvent;
GetEvent::GetEvent():ClassA( ID, newMsg, NULL, NULL, 0 )
{
//no stmts inside;
}

无法理解行 GetEvent::GetEvent((:ClassA( ID, NewMsg, NULL, NULL, 0 (。他们是否从派生类构造函数传递接收到的值,然后将其分配给基类构造函数。如果是这样,那么 newMsg 将保持未定义状态,因为它在调用基类构造函数时被定义......如果在相反的情况下采用,那么 ID 将保持未定义状态...

无法理解语句的执行,

static const GetEvent cGetEvent;
GetEvent::GetEvent():ClassA( ID, newMsg, NULL, NULL, 0 )
{
//no stmts inside;
}

还有函数指针,

typedef ClassA* (*pNewMsg)(void); 
#define DECLARE_NEWMSG(ClassName,ClassID)                
static ClassName* FromMsg(ClassA* psg)               
{                                                       
   return dynamic_cast<ClassName*>(psg);              
}                                                       
static ClassA* newMsg()                            
{                                                       
   return new ClassName;                               
} 
static const GetEvent cGetEvent;
GetEvent::GetEvent():ClassA( ID, newMsg, NULL, NULL, 0 )
{
//no stmts inside;
}

此语法称为初始化列表,可用于在构造期间初始化类成员。构造派生类对象时,其父类也将初始化(从层次结构的顶部开始(。在这种情况下,GetEvent构造函数指定如何构造ClassA对象(尽管读取代码,但classA的实际类定义未指定此构造函数(。

typedef ClassA* (*pNewMsg)(void); 

此函数指针类型定义表示...

我们可以调用的函数指针pNewMesg它不带参数(void(并返回指向ClassA对象的指针。

在常见问题

解答中对函数指针 typedef 语法的解释稍好一些C++:http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.5