【发布时间】:2012-08-03 11:40:21
【问题描述】:
语言:C/C++
问题:举个常见的例子,其中
- A 是父类。
- B 和 C 都继承自类 A。
- D 继承自 B 和 C
我们想通过D的对象来访问A的函数
注意:它是虚拟继承!所以我们知道A只有一个对象。
问题是:B 或 C 将首先创建谁的对象?
牢记层次结构
A
/ \
B C
\ /
D
【问题讨论】:
标签: oop diamond-problem
语言:C/C++
问题:举个常见的例子,其中
我们想通过D的对象来访问A的函数
注意:它是虚拟继承!所以我们知道A只有一个对象。
问题是:B 或 C 将首先创建谁的对象?
牢记层次结构
A
/ \
B C
\ /
D
【问题讨论】:
标签: oop diamond-problem
简而言之,OO 本身对此没有任何保证。
如果您谈论的是特定的实现或语言(但问题不是),则可能对此有保证。
【讨论】:
class D : public B, public C 将在 C 之前构造 B。
是的,这个问题有时也被省略为死亡之钻。
很遗憾,无法回答您的问题:它基于您当前使用的编程语言。
例如,在 Scala 中(允许对特征进行多重继承),沿 linearization algorithm 的实例化有一条非常严格的规则,您可以在那里找到正确的详细信息。
我想你在玩 C++。如果正确,请查看C++ FAQ (the problem is also mentioned there) 的正确部分。
【讨论】:
如果你说的是 C++ 和类的实例化顺序,那么它将取决于声明中的继承顺序。
所以,在
class D : public B,public C
B 会先被实例化,然后是 C。
class D : public C,public B
C 会先被实例化,然后是 B。
【讨论】: