C++ 什么是多重虚拟继承?

C++ 什么是多重虚拟继承?,c++,virtual-inheritance,C++,Virtual Inheritance,bar and kung类是一个抽象类,包含在foo clas内部实现的纯虚拟方法 这有什么用?在您的例子中,如果bar和kung是最派生的基类,只要bar和kung中没有方法冲突,这没有什么区别,但如果发生冲突,您就会知道,即编译器的错误定义不明确 P> > C++中的FAQ:< P>如果其他的,未来类从一个以上的方式派生出 Foo,那么大多数派生类将只包含一个、虚拟基类 Bar < /C>和 Kung/Cuth>: class foo : public virtual bar, publi

bar and kung类是一个抽象类,包含在foo clas内部实现的纯虚拟方法


这有什么用?

在您的例子中,如果bar和kung是最派生的基类,只要bar和kung中没有方法冲突,这没有什么区别,但如果发生冲突,您就会知道,即编译器的错误定义不明确


<> P> > C++中的FAQ:

< P>如果其他的,未来类从一个以上的方式派生出 Foo,那么大多数派生类将只包含一个、虚拟基类<代码> Bar < /C>和<代码> Kung/Cuth>:

class foo : public virtual bar, public virtual kung
{
  // implementation of the method of the above inherited class
};
类型为
Gizmo
的对象具有唯一的类型为
bar
的基子对象,对于
kung
也是如此,而不是每个派生路径有两个不同的基子对象


注意,如果一个类只有纯虚函数,没有非静态成员,只有相同性质的基类,那么虚继承和非虚继承之间就没有实际区别,因为类是空的。其他一些较低级的语言将此类类称为“接口”,这意味着可以从这些类中多次继承,即使此类语言不支持通用类的多次继承。

通过这样做,foo类isa bar和isa kung

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

功夫课也是如此


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

可能重复的…或可能重复的:我相信有很多文章都在讨论这一点。“没有错误”,因为类是空的,他们不是,他们有一个VPTR!好奇的家伙:尽管语言是空的,但是类是空的。C++中没有“VPTR”;这只是一个实现细节。“在语言方面,这些类是空的。”根据“C++中没有“VPTR”;这仅仅是一个实现细节。
struct A : foo { };
struct B : foo { };

class Gizmo : public A, public B { }; // only *one* bar and kung base class.