gpt4 book ai didi

c++ - 警告 : base class ‘A’ should be explicitly initialized in the copy constructor

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:57 26 4
gpt4 key购买 nike

我有以下类结构:

class A{
A(){}
A(const A& src){}
};

class B : virtual A {
B():A(){}
B(const B& src):A(src){}
};

class C : virtual A {
C():A(){}
C(const C& src):A(src){}
};
class D : virtual B, virtual C {
D():B(),C(){}
D(const D& src):B(src),C(src){}
};

这给了我警告:

In copy constructor ‘D’:

warning: base class ‘A’ should be explicitly initialized in the copy constructor

我不明白。D 的 Copy 构造函数调用 B 的 copy-ctor,B 调用 A 的 copy-ctor。为什么它要我在 D 中调用 A 的 copy-ctor

如果我这样做,A 的 copy-ctor 不会被调用两次吗?一次从 B 调用,一次从 D 调用。

非常感谢对此的任何意见。

最佳答案

现在我已经确认我是对的,B使用虚拟继承从A派生。

发生这种情况时,最派生的类负责构造基类。这允许多重继承菱形。

======== A ============
^ ^
B C
\ /
\ /
\ /
\ /
D

D 派生自 B 和 C,并且都派生自 A,因此 D 将继承 A 的 2 个拷贝,一份来自 B,一份来自 C。

如果B1和B2都使用虚继承从A派生,那么final类必须初始化基类,即A,从而保证只有一次实例。

这就是您收到错误消息的原因。

关于c++ - 警告 : base class ‘A’ should be explicitly initialized in the copy constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098979/

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