【发布时间】:2023-03-23 07:01:02
【问题描述】:
我知道钻石问题,但问题是 - 当我在谷歌上搜索“虚拟继承”时,结果仅提到了钻石问题。我想知道它一般是如何工作的,以及它与普通继承有何不同。
我知道当一个类(通常)从另一个类继承时,它只包含它的所有成员(字段和方法,撇开访问级别)。其中一些可能会被新成员覆盖或隐藏,但它们仍然存在。继承还定义了层次结构中的类之间的某些关系,这会影响强制转换和多态性。
现在虚拟继承有何不同?例如:
class A
{
public:
int a;
int b;
void fun(int x)
{}
void gun(int x)
{}
};
class B : public A
{
public:
int a;
int c;
void fun(int x)
{}
void hun(int x)
{}
};
class C : virtual public A
{
public:
int a;
int c;
void fun(int x)
{}
void hun(int x)
{}
};
B 和C 有什么区别?我的示例没有利用其他差异吗?标准是怎么说的?另外,如果 C++03 和 C++11 有区别,请指出。
【问题讨论】:
-
区别在于继承自
B的类和继承自C的类。 -
你只能得到关于可怕的死亡钻石的结果的原因是因为这是虚拟继承解决的唯一问题。区别在于 DDoD 中派生度最高的类。
-
你是说只有 1 级继承(Base - Derived),除了实现细节(如
vtable)之外,普通继承和虚拟继承之间绝对没有任何区别 ?
标签: c++ inheritance virtual-inheritance