在 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

更新日期:30-7 月-2019

221 次瀏覽

開啟你的 職業生涯

完成課程即可獲得認證

開始吧
廣告
© . All rights reserved.