73

“虚拟”继承是什么意思?

看了下面的代码,没看懂virtual下面上下文中关键字的含义:

class A {};
class B : public virtual A;
4

1 回答 1

55

虚拟继承用于解决 DDD 问题(Dreadful Diamond on Derivation)。

看下面的例子,你有两个继承自同一个基类的类:

class Base
{

public:

 virtual void  Ambig();

};

class C : public Base
{

public:

//...

};

class D : public Base
{
public:

    //...

};

现在,您要创建一个继承自 C 和 D 类的新类(它们都继承了 Base::Ambig() 函数):

class Wrong : public C, public D
{

public:

...

};

当您在上面定义“错误”类时,您实际上创建了 DDD(钻石派生问题),因为您不能调用:

Wrong wrong;
wrong.Ambig(); 

这是一个模棱两可的函数,因为它被定义了两次:

Wrong::C::Base::Ambig()

和:

Wrong::D::Base::Ambig()

为了防止这种问题,你应该使用虚拟继承,它会知道引用正确的Ambig()函数。

所以 - 定义:

class C : public virtual Base

class D : public virtual Base

class Right : public C, public D
于 2009-01-07T11:40:15.657 回答