我有以下类结构:
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){}
};
这给了我警告:
在复制构造函数“D”中:
警告:基类“A”应在副本中显式初始化
构造函数
我不明白。
D 的复制构造函数调用copy-ctor
B 称为copy-ctor
A 的。
为什么它要我打电话给copy-ctor
D 中的 A?
如果我这样做,岂不是copy-ctor
A 被调用两次?一次从 B 调用,一次从 D 调用。
对此的任何意见都非常感谢。
现在我证实我是对的,B使用虚拟继承从A派生。
当发生这种情况时,最派生的类负责构造基类。这允许多重继承菱形。
======== A ============
^ ^
B C
\ /
\ /
\ /
\ /
D
D 派生自 B 和 C,并且都派生自 A,因此 D 将继承 A 的 2 个副本,一份来自 B,一份来自 C。
如果B1和B2都使用虚继承从A派生,那么最终类必须初始化基类,即A,从而保证只有一次实例。
这就是您收到错误消息的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)