在C ++中的构造函数中调用虚函数
从构造函数或析构函数调用的虚函数是危险的,应尽可能避免使用,因为我们调用的虚函数是从基类而不是派生类调用的。
原因是在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