在 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
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP