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

更新日期:2020 年 6 月 24 日

678 次瀏覽

開啟您的職業生涯

完成課程並獲得認證

立即開始
廣告