虚继承

“虚拟”继承的含义是什么?

我看到了下面的代码,不明白关键字 virtual在下面的上下文中的含义:

class A {};
class B : public virtual A;
72111 次浏览

虚继承是用来解决 DDD 问题的。

请看下面的示例,其中有两个从同一个基类继承的类:

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