从基类构造函数中调用派生类的成员函数

Rug*_*rra 2 c++ inheritance

假设我有

struct C {
   C() { init(); };
   void init() { cout << "C" << endl; };
};

struct D : public C {
   D() : C() { };
   void init() { cout << "D" << endl; }
};

D();
Run Code Online (Sandbox Code Playgroud)

为什么我打印"C"?如何改变这种行为(并得到"D").

如果我想要两个怎么办?

Rem*_*eau 6

为什么我打印"C"?

C::init()未声明为virtual,因此D无法覆盖它.但是,即使C::init()被声明为virtual,D::init()仍然不会被调用时init()被调用里面C的构造.

C++在派生类之前构造基类(并在基类之前销毁派生的clases).所以C构造函数在构造之前运行D(并且C析构函数在D被破坏之后运行).正在构造/破坏的对象的VMT在构造/破坏时根本不指向D方法表C,而是指向C方法表.

如何改变这种行为(并得到"D").

不能从基类构造函数/析构函数内部调用派生的虚方法.VMT在这些阶段不包含指向派生类方法表的指针.