我试图理解为什么,以及是否可以从父构造函数调用子方法。
首先我尝试了:
#define prn printf(__FUNCTION__);printf("\r\n");
class A
{
public:
A(){init();}
~A(){prn;}
virtual void f(){}
virtual void init()=0;
};
class B : public A<B>
{
public:
B(){prn;}
~B(){prn;}
virtual void init(){prn;}
};
用纯虚拟调用粉碎。我猜是因为 A() 中的 init() 指向 A 的虚拟表中的 init() 。我用这条线确认了这一点:
virtual void init()=0{prn};
所以,我尝试了以下方法:
template<typename T>
class A
{
public:
A(){((T*)this)->init();}
~A(){prn;}
virtual void f(){}
virtual void init()=0{prn;}
};
class B : public A<B>
{
public:
B(){prn;}
~B(){prn;}
virtual void init(){prn;}
};
哪个也粉碎!现在我唯一的猜测是它发生是因为虚拟表刚刚被创建,但这只是一个猜测......
谁能解释一下这是怎么回事?
谢谢!
最佳答案
当你在基类构造函数中时,派生类的细节还没有被填充——这意味着虚函数表还没有被完全填充。虚函数表不指向任何派生类函数。
如果从基类构造函数调用虚成员函数,可能会发生以下情况:
如果基类有函数的实现,将调用它。这将是最好的情况。请记住,即使它被声明为纯虚拟,也可以在基类中定义虚拟成员函数。
如果基类没有成员函数,则函数的虚函数表中的条目可能为 NULL(初始化良好)或未初始化的内容。您可能会抛出异常或违反分段,或任何行为——您正在进入未定义行为的领域。
关于c++ - 为什么在构造函数中调用在 child 中实现的纯虚函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23452383/