在C ++中的构造函数中调用虚函数

从构造函数或析构函数调用的虚函数是危险的,应尽可能避免使用,因为我们调用的虚函数是从基类而不是派生类调用的。

原因是在C ++中,超类是在派生类之前构造的。因此,在下面的示例中,由于必须实例化B,因此必须先实例化D。调用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