1

和有什么区别

class A {};
class Z: public A {};

class A {};
class Z: virtual public A {};
4

3 回答 3

8

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

class ZA : public Z, public A {};

对比

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

在第一种情况下,ZA将有两个具有单独As 的区域 - 一个直接继承,一个通过 s 继承Z。在第二种情况下,只有一个A,通过两条路径继承并共享。

这是一个例子:

虚拟与常规继承

于 2013-09-13T13:48:52.180 回答
3

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

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

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

这通常不是您想要的,因为它不遵循继承通常建模的“is-a”关系:有两种不同的方式YZ可以将 a 视为A.

void f(A&);
YZ yz;
f(yz);    // ERROR: which A?

但是对于 的虚拟继承A,将只有一个子对象,由andA共享;上面的例子现在将是明确的。YZ

于 2013-09-13T13:57:09.293 回答
0

假设您有两个派生类B并且C有一个公共基类A。你有另一个D继承了它们的类。您将使用public virtual A来确保两者都B使用C相同的子对象A

从这里获取的信息:虚拟基类

于 2013-09-13T13:51:06.877 回答