之间有什么区别
Class A {};
Class Z: public A {};
和
Class A {};
Class Z: virtual public A{};
答案 0 :(得分:8)
假设没有额外的继承层次结构,在这种情况下没有区别。查看差异的唯一方法是通过多种方式继承同一个类 - 例如,如下所示:
class ZA : public Z, public A {};
VS
class ZA : virtual public Z, virtual public A {};
在第一种情况下,ZA
会有两个区域A
- 一个直接继承,一个通过Z
继承。在第二种情况下,只有一个A
,通过两个路径继承,并共享。
以下是对此的说明:
答案 1 :(得分:3)
不同之处在于从多个共享公共基类的类继承时的行为:
class A {};
class Y : public A {};
class Z : public A {};
class YZ: public Y, public Z {};
在这种情况下,使用非虚拟继承,YZ
对象将包含Y
和Z
个子对象,每个子对象都有自己的A
子对象。
这通常不是你想要的,因为它不遵循继承通常建模的“is-a”关系:YZ
可以通过两种不同的方式被视为{{1} }}
A
但是对于void f(A&);
YZ yz;
f(yz); // ERROR: which A?
的虚拟继承,只有一个A
子对象,由A
和Y
共享;上面的例子现在将是明确的。
答案 2 :(得分:0)
假设您有两个派生类B
和C
,它们具有公共基类A
。而且你有另一个继承它们的类D
。您可以使用public virtual A
确保B
和C
使用相同的子对象A
。
从这里获取信息:Virtual Base Classes