gpt4 book ai didi

继承中的 C++ 复制构造函数

转载 作者:太空狗 更新时间:2023-10-29 20:51:08 26 4
gpt4 key购买 nike

#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 的复制构造函数?

最佳答案

您的代码创建了 D 实例的拷贝,并调用其复制构造函数。

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

虚拟继承类可以被认为是最派生类的直接父类(super class)。这就是虚拟继承的意思。因此,在您的 D 实例中,它实际上继承的 AD 的直接父类(super class),而不是 BC;因此,BCA 复制构造函数的调用不是 调用。

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

关于继承中的 C++ 复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51686623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com