c++ - 为什么在构造函数中调用在 child 中实现的纯虚函数不起作用?

标签 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 的虚拟表中的 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. 如果基类有函数的实现,将调用它。这将是最好的情况。请记住,即使它被声明为纯虚拟,也可以在基类中定义虚拟成员函数。

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

关于c++ - 为什么在构造函数中调用在 child 中实现的纯虚函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23452383/

相关文章:

java - 使用泛型和反射时出现不兼容类型错误

c++ - looking for c++ member function override (non virtual) 解决方案

java - Android Studio:运行我的应用程序时出现:“Could not create the Java Virtual Machine”错误

c++ - 插入排序 : why assigning key to j+1 index?

c++ - 什么是参数值的尖括号,它的用途是什么?

c++ - OpenGL 4,错误的缓冲区偏移值

c++ - 为什么所有关于 virtual 关键字的模糊不清?

c++ - 使用 CRTP 创建特征矩阵

c# - 为什么具有泛型类型的基本 Windows 窗体窗体类会停止设计器加载?

c++ - 子对象中存在 VPTR