【问题标题】:C++ copy constructor in inheritance继承中的 C++ 复制构造函数
【发布时间】:2019-01-12 04:09:45
【问题描述】:
#include<iostream>
using namespace std;
class A
{
public:
     A(){ cout <<"1";}
     A(const A &obj){cout <<"2";}
};

class B: virtual A
{
public:
    B(){cout <<"3";}
    B(const B & obj):A(obj){cout<<"4";}
};

class C: virtual A
{
public:
   C(){cout<<"5";}
   C(const C & obj):A(obj){cout <<"6";}
};

class D:B,C
{
public:
    D(){cout<<"7";}
    D(const D & obj):C(obj),B(obj){cout <<"8";}
};

int main()
{
   D d1;
   D d(d1);
}

我得到 13571468 作为输出。但我认为输出应该是 13572468。为什么正常的构造函数运行而不是 A 类的复制构造函数?

【问题讨论】:

标签: c++ inheritance constructor copy-constructor virtual-inheritance


【解决方案1】:

您的代码复制D 的实例,调用其复制构造函数。

您的类D 的复制构造函数仅调用其CB 超类的复制构造函数。因为它不调用A 的复制构造函数,所以它是默认构造的。

虚拟继承的类可以被认为是最派生类的直接超类。这就是虚拟继承的意思。因此,在您的D 实例中,其虚拟继承的AD 的直接超类,而不是BC 的直接超类;因此,BCA 复制构造函数的调用没有被调用。

当您有一个虚拟继承的类时,您的所有构造函数实际上都有两个“在幕后”创建的版本:一个负责构造任何虚拟继承的类,另一个不负责。不是调用虚拟继承类的构造函数。

【讨论】:

  • 为什么C的copy c'tor不调用A的copy c'tor?
  • 因为它不负责这样做。只有最派生的类才能构造所有虚拟继承的超类。我修改了我的答案来解释这一点。如果你复制构造C,它会做到的。但是如果你复制构造 D,它就不会那样做。 D负责构建A。
  • 深入了解有 两个 用于 C 和的复制构造函数这一事实可能会有所帮助。
  • 如果我这样做 D(const D & obj):C(obj),B(obj),A(obj){cout
  • 您必须明确声明D 虚拟继承自A,就像所有其他类一样。然后你可以调用它的复制构造函数。如果你不声明它,它当然实际上仍然继承A。但它总是使用它的默认构造函数。
猜你喜欢
  • 1970-01-01
  • 2014-06-15
  • 2012-09-20
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 2017-08-09
  • 2015-04-11
相关资源
最近更新 更多