在 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 次浏览

开启你的 职业生涯

完成课程即可获得认证

开始吧
广告