具有额外 class 复制构造函数的钻石继承
Diamond inheritance with additional class copy constructor
所以我最近想知道,如果我们有一个基 class A
被 B
实际继承,那么 class 的复制构造函数会是什么样子,并且C
,其中 B
和 C
被 D
继承,D
被 E
继承。
所以我有点困惑。 D
的复制构造函数是否应该在其初始化列表中仍然具有基础 class 的 (A
) 构造函数,或者现在是 E
的工作? E
可以非虚拟地继承 D
我是对的吗?
是的,A
应该还在初始化列表中,E
实际上不需要继承D
。构建顺序应该是:
A() --> B() --> C() --> D()
隐式生成的复制构造函数工作正常,但如果您想自己显式编写它,它可能看起来像:
D(D const &o): A(o), B(o), C(o) {}
E(E const &o): A(o), D(o) {}
出于初始化目的,虚拟基 类 的行为就好像它们是最派生对象的直接基一样。子对象中的任何初始化程序都将被忽略(例如,在我的 E
代码中,初始化 D(o)
实际上不会初始化 A
,尽管 A
列在 D
的拷贝构造函数).
无论E
虚拟是否继承D
,这都是一样的。
所以我最近想知道,如果我们有一个基 class A
被 B
实际继承,那么 class 的复制构造函数会是什么样子,并且C
,其中 B
和 C
被 D
继承,D
被 E
继承。
所以我有点困惑。 D
的复制构造函数是否应该在其初始化列表中仍然具有基础 class 的 (A
) 构造函数,或者现在是 E
的工作? E
可以非虚拟地继承 D
我是对的吗?
是的,A
应该还在初始化列表中,E
实际上不需要继承D
。构建顺序应该是:
A() --> B() --> C() --> D()
隐式生成的复制构造函数工作正常,但如果您想自己显式编写它,它可能看起来像:
D(D const &o): A(o), B(o), C(o) {}
E(E const &o): A(o), D(o) {}
出于初始化目的,虚拟基 类 的行为就好像它们是最派生对象的直接基一样。子对象中的任何初始化程序都将被忽略(例如,在我的 E
代码中,初始化 D(o)
实际上不会初始化 A
,尽管 A
列在 D
的拷贝构造函数).
无论E
虚拟是否继承D
,这都是一样的。