class foo : public virtual bar, public virtual kung
{
// implementation of the method of the above inherited class
};
bar和kung类是一个抽象类,它包含在foo clas中实现的纯虚方法。
这有什么用?
答案 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对象。