在 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