在 C++ 中的构造函数内部调用虚拟函数
从构造函数或析构函数调用虚拟函数很危险,应尽可能避免,因为我们调用的虚拟函数是从基类中调用的,而不是从派生类中调用的。
原因在于,在 C++ 中,超类是在派生类之前构造的。因此,在以下示例中,在实例化 D 之前,必须实例化 B。当调用 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
广告