c ++中虚拟和简单继承的区别

时间:2013-09-13 13:46:51

标签: c++ inheritance virtual

之间有什么区别
Class A {};
Class Z: public A {};

Class A {};
Class Z: virtual public A{};

3 个答案:

答案 0 :(得分:8)

假设没有额外的继承层次结构,在这种情况下没有区别。查看差异的唯一方法是通过多种方式继承同一个类 - 例如,如下所示:

class ZA : public Z, public A {};

VS

class ZA : virtual public Z, virtual public A {};

在第一种情况下,ZA会有两个区域A - 一个直接继承,一个通过Z继承。在第二种情况下,只有一个A,通过两个路径继承,并共享。

以下是对此的说明:

Virtual vs. Regular inheritance

答案 1 :(得分:3)

不同之处在于从多个共享公共基类的类继承时的行为:

class A {};
class Y : public A {};
class Z : public A {};
class YZ: public Y, public Z {};

在这种情况下,使用非虚拟继承,YZ对象将包含YZ个子对象,每个子对象都有自己的A子对象。

这通常不是你想要的,因为它不遵循继承通常建模的“is-a”关系:YZ可以通过两种不同的方式被视为{{1} }}

A

但是对于void f(A&); YZ yz; f(yz); // ERROR: which A? 的虚拟继承,只有一个A子对象,由AY共享;上面的例子现在将是明确的。

答案 2 :(得分:0)

假设您有两个派生类BC,它们具有公共基类A。而且你有另一个继承它们的类D。您可以使用public virtual A确保BC使用相同的子对象A

从这里获取信息:Virtual Base Classes