从构造函数或析构函数调用的虚函数是危险的,应尽可能避免使用,因为我们调用的虚函数是从基类而不是派生类调用的。
原因是在C ++中,超类是在派生类之前构造的。因此,在下面的示例中,由于必须实例化B,因此必须先实例化D。调用B的构造函数时,它还不是D,因此虚拟功能表仍具有B的副本的条目s()
。
#include<iostream> using namespace std; class B { public: B() { s(); } virtual void s() { cout << "Base" << endl; } }; class D: public B { public: D() : B() {} virtual void s() { cout << "Derived" <<endl; } }; int main() { D de; }
输出结果
Base