【问题标题】:Virtual helper function of copy constructor not being called未调用复制构造函数的虚拟辅助函数
【发布时间】:2017-12-15 01:37:57
【问题描述】:

此代码的输出产生“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;
} 

【问题讨论】:

标签: c++ inheritance


【解决方案1】:

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

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

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

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

【讨论】:

  • 一切顺利,谢谢!有没有办法缓解这个问题,因为让派生类处理复制(例如在创建某些容器的派生类时)而不需要不需要的代码会很好
  • 派生类需要定义派生类的copy-constructor,然后调用基类的方法,或者任何需要做的事情来高效地回收代码。
猜你喜欢
  • 1970-01-01
  • 2019-01-10
  • 2016-04-09
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多