为什么在子内部构造函数中调用纯虚函数不起作用?

时间:2014-05-04 03:48:38

标签: c++ inheritance virtual

我试图理解为什么,以及是否可以从父构造函数调用子方法。

首先我尝试了:

#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;}
};

哪个也粉碎了!现在我的唯一猜测就是因为虚拟桌子正在制作,但它只是一个猜测......

有人可以解释发生了什么吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

当您在基类构造函数中时,尚未填充派生类的详细信息 - 这意味着虚拟函数表尚未完全填充。虚函数表不指向任何派生类函数。

如果从基类构造函数中调用虚拟成员函数,可能会发生以下几种情况:

  1. 如果基类具有该函数的实现,则将调用该函数。这将是最好的情况。请记住,即使将其声明为纯虚拟,也可以在基类中定义虚拟成员函数。

  2. 如果基类没有成员函数,则函数的虚函数表中的条目可以是NULL(已初始化)或未初始化的内容。您可能会遇到异常抛出或分段违规或任何行为 - 您正在进入未定义行为的领域。