调用构造函数中的虚拟函数

调用构造函数中的虚拟函数

假设我有两个C+类:

class A{public:
  A() { fn(); }

  virtual void fn() { _n = 1; }
  int getn() { return _n; }protected:
  int _n;};class B : public A{public:
  B() : A() {}

  virtual void fn() { _n = 2; }};

如果我编写以下代码:

int main(){
  B b;
  int n = b.getn();}

人们可能会想到n设置为2。

结果证明n设置为1。为什么?


繁华开满天机
浏览 496回答 3
3回答

慕婉清6462132

原因是C+对象是像洋葱一样从内到外构造的。超类是在派生类之前构造的。所以,在制造B之前,必须先制造A。当调用A的构造函数时,它还不是B,因此虚拟函数表仍然有A的fn()副本的条目。
打开App,查看更多内容
随时随地看视频慕课网APP