什么是多重虚拟继承?

时间:2012-05-08 19:05:45

标签: c++ virtual-inheritance

class foo : public virtual bar, public virtual kung
{
  // implementation of the method of the above inherited class
};

bar和kung类是一个抽象类,它包含在foo clas中实现的纯虚方法。

这有什么用?

3 个答案:

答案 0 :(得分:1)

在你的情况下,如果bar和kung是派生最多的基类,没有区别,只要没有bar和kung中的方法发生冲突,但如果确实如此,你就会知道它,即编译器在模糊定义中的错误。< / p>

有关c ++ faq的更多信息:http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.9

答案 1 :(得分:0)

如果其他未来的类以多种方式从foo派生,则派生程度最高的类将仅包含一个,虚拟基类bar和{{ 1}}:

kung

类型为struct A : foo { }; struct B : foo { }; class Gizmo : public A, public B { }; // only *one* bar and kung base class. 的对象具有Gizmo类型的唯一基础子对象,并且bar具有同上,而不是每个派生路径有两个不同的对象。

请注意,如果一个类只有 纯虚函数而且没有非静态成员且只有相同性质的基类,那么虚拟和非虚继承之间没有实际区别,因为这些课是空的。其他较小的语言称这样的类为“接口”,这意味着 可以从它们中继承,即使这些语言不支持一般类的多重继承。

答案 2 :(得分:0)

通过这样做,foo类是一个酒吧和isa kung。

如果你有一个带有bar对象的函数或方法,那么foo类的实例化就有资格。由于bar类具有纯虚方法,因此如果对象被实例化,编译器将需要foo(或从foo派生的类)来定义方法。接受bar对象的代码可以依赖于知道传递给它的bar对象实现该方法,即使该对象是foo类的实例(或从foo派生的类)。

同样适用于kung课程。

因此,如果foo类实现了bar中的所有纯虚方法(编译器需要实例化foo对象),那么foo对象可以传递给需要bar,kung或者a的任何东西。 foo对象。