假设我有
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").
如果我想要两个怎么办?
为什么我打印"C"?
C::init()未声明为virtual,因此D无法覆盖它.但是,即使C::init()被声明为virtual,D::init()将仍然不会被调用时init()被调用里面C的构造.
C++在派生类之前构造基类(并在基类之前销毁派生的clases).所以C构造函数在构造之前运行D(并且C析构函数在D被破坏之后运行).正在构造/破坏的对象的VMT在构造/破坏时根本不指向D方法表C,而是指向C方法表.
如何改变这种行为(并得到"D").
您不能从基类构造函数/析构函数内部调用派生的虚方法.VMT在这些阶段不包含指向派生类方法表的指针.