我试图理解为什么,以及是否可以从父构造函数调用子方法。
首先我尝试了:
#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&#39的虚拟表中的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;}
};
哪个也粉碎了!现在我的唯一猜测就是因为虚拟桌子正在制作,但它只是一个猜测......
有人可以解释发生了什么吗?
谢谢!
答案 0 :(得分:3)
当您在基类构造函数中时,尚未填充派生类的详细信息 - 这意味着虚拟函数表尚未完全填充。虚函数表不指向任何派生类函数。
如果从基类构造函数中调用虚拟成员函数,可能会发生以下几种情况:
如果基类具有该函数的实现,则将调用该函数。这将是最好的情况。请记住,即使将其声明为纯虚拟,也可以在基类中定义虚拟成员函数。
如果基类没有成员函数,则函数的虚函数表中的条目可以是NULL(已初始化)或未初始化的内容。您可能会遇到异常抛出或分段违规或任何行为 - 您正在进入未定义行为的领域。