如何在 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
廣告