复制构造函数的虚拟辅助函数未被调用

时间:2017-12-15 01:37:58

标签: c++ inheritance

此代码的输出产生“BASE!”。为什么在此示例中未调用派生类的复制功能。它们具有相同的签名,根据我的推理,应该调用派生的签名。有什么问题?

#include <iostream>
using namespace std;

class Base{
   virtual void copy(const Base&b){
      cout<<"BASE!";
   }
public:
   Base()=default;
   Base(const Base&b){
      copy(b);
   }
};

class Derived: public Base{
    void copy(const Base&b) override{
        cout<<"DERIVED";
    }
};

int main() {
    Derived d;
    Derived b(d);
    return 0;
} 

1 个答案:

答案 0 :(得分:4)

它没有被调用,因为它还没有存在。

首先构造基类。它的copy-constructor调用虚方法。在首先构造基类之前,派生类不会被构造,因此基类中的虚拟类方法不会被任何东西覆盖。

只有在派生类构造开始时,虚拟类方法才会被派生类覆盖。

派生类实例在实际构造之前根本不存在,并且在基类完全构造之前它不构造,因此在基类构造期间虚拟方法不是被任何事情所覆盖。