和有什么区别
class A {};
class Z: public A {};
和
class A {};
class Z: virtual public A {};
和有什么区别
class A {};
class Z: public A {};
和
class A {};
class Z: virtual public A {};
假设没有额外的继承层次结构,在这种情况下没有区别。唯一能看出区别的方法是通过多种方式继承同一个类——例如,如下:
class ZA : public Z, public A {};
对比
class ZA : virtual public Z, virtual public A {};
在第一种情况下,ZA将有两个具有单独As 的区域 - 一个直接继承,一个通过 s 继承Z。在第二种情况下,只有一个A,通过两条路径继承并共享。
这是一个例子:

不同之处在于当您从共享公共基类的多个类继承时的行为:
class A {};
class Y : public A {};
class Z : public A {};
class YZ: public Y, public Z {};
在这种情况下,使用非虚拟继承,一个YZ对象将包含Y和Z子对象,每个子对象都有自己的A子对象。
这通常不是您想要的,因为它不遵循继承通常建模的“is-a”关系:有两种不同的方式YZ可以将 a 视为A.
void f(A&);
YZ yz;
f(yz); // ERROR: which A?
但是对于 的虚拟继承A,将只有一个子对象,由andA共享;上面的例子现在将是明确的。YZ
假设您有两个派生类B并且C有一个公共基类A。你有另一个D继承了它们的类。您将使用public virtual A来确保两者都B使用C相同的子对象A。
从这里获取的信息:虚拟基类