0

我对虚拟基类有疑问。为了解决多重继承中的“可怕的死亡钻石”/歧义问题,引入了虚拟基类。

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};

声明virtual中未使用关键字时会发生什么。class C你能详细解释一下吗?

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};
4

3 回答 3

3

如果您的继承不是virtual,那么A成员将在D课堂上出现两次。

如果A有一个名为 的字段_a,那么,在D,写入B::_aC::_a将引用两个不同的内存区域。如果你的继承是virtual那么你只有一个记忆区。

于 2013-04-08T07:03:07.130 回答
0
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};

如果从 A 类到 B 的继承标记为虚拟但不是 A 类到 C,则 C++ 将创建单个虚拟 A(D 继承 B,B 继承 A)和一个非虚拟 A(D 继承 C,C 继承 A)。因此,您的代码不会解决菱形问题:

D d_object;
A &a_ref = d_object; // error raised -> B::A or C::A
于 2014-11-02T17:16:03.433 回答
0

如果您使用的是virtual,那么当您foo()使用Class D. 如果您不使用虚拟,那将是模棱两可的..但是要小心虚拟继承成本更高,所以要小心使用它..

于 2013-04-08T07:11:29.777 回答