和有什么区别
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
将有两个具有单独A
s 的区域 - 一个直接继承,一个通过 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
共享;上面的例子现在将是明确的。Y
Z
假设您有两个派生类B
并且C
有一个公共基类A
。你有另一个D
继承了它们的类。您将使用public virtual A
来确保两者都B
使用C
相同的子对象A
。
从这里获取的信息:虚拟基类