如何在 C++ 建構函式中呼叫虛擬函式?
在建構函式或解構函式中呼叫虛擬函式很危險,並且應儘可能避免。這是因為您呼叫的虛擬函式是從基類而非派生類呼叫的。
在 C++ 中,每個類在進入其自身構造之前都會構建其版本的虛方法表。因此,在建構函式中對虛擬方法的呼叫將呼叫基類的虛擬方法。或者,如果它在那一個層級中沒有實現,它將產生一個純虛擬方法呼叫。一旦基類完全構造,編譯器將開始構建派生類,並覆蓋方法指標以指向派生類的實現。因此,例如,如果您有程式碼 -
示例
#include<iostream>
using namespace std;
class Base {
public:
Base() { f(); }
virtual void f() { std::cout << "Base" << std::endl; }
};
class Derived : public Base {
public:
Derived() : Base() {}
virtual void f() { std::cout << "Derived" << std::endl; }
};
int main() {
Derived d;
return 0;
}輸出
這將生成以下輸出 -
Base
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP