我理解虚拟基类机制的存在是为了防止“钻石”问题。但我很好奇,如果重新设计类层次结构不能更好地处理这种情况。以以下案例为例:copied from here
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
我现在看到的机制存在的问题是,您需要能够预测某个人将从B和C继承过来吗?所以,这并不意味着我们最好用虚拟标记来标记每一个继承?
发布于 2015-01-15 13:22:13
类A
的虚拟继承意味着
A
,并且A
事物的访问效率有所降低(因为A
子对象可以在多个派生类对象之间共享,因此可以在每个派生类对象中处于动态偏移)。出于这些原因,虚拟继承是谨慎使用的。
一个好的经验法则是对接口使用虚拟继承,而不是对实现类使用虚拟继承。
发布于 2015-01-15 13:23:32
您可以在virtual
成员函数上提出同样的观点--为什么不将所有成员函数virtual
设置为virtual
,因为如果有人从您的class
中继承了成员函数,那么他们可能希望能够覆盖您的成员函数。我们不这样做,因为对于virtual
基类,virtual
成员函数需要额外的成本(时间/资源开销和复杂性)。
发布于 2015-01-15 14:23:58
在所有具有多重继承特性的语言中,虚拟继承都是必须具备的特性.虽然有可能所有继承案例都是虚拟的,但这有:
这是因为虚拟继承是继承的特例,继承是类的直接派生的指令,而不是类本身。因此,每个派生另一个类的基类--实际上是--都将这个虚拟基类作为直接基类提供给每个下一个派生类。当然,如果多个基类提供相同的虚拟基类,则会导致派生类派生一次,但这是因为这些多个基类提供了多个派生指令,但提供了一个类(与正常继承不同,在这种情况下基类将提供基类的多个子对象)。
它始终是一个直接基类的结果是在每个下一个派生类中显式地构造它的要求。当然,默认构造函数规则是适用的,但是在这条规则中,C++甚至不是后续的--基类初始化虚拟基的代码被接受;唯一被拒绝的情况是,当虚拟基在多个基类中被“竞争性初始化”时--在这种情况下,您必须通过提供构造规范来“解决冲突”。
请不要因为无能的自我推销而抨击我,但我在这里更详细地描述了这个话题:
https://sektorvanskijlen.wordpress.com/2010/12/08/multiple-inheritance-considered-nice
https://stackoverflow.com/questions/27964234
复制相似问题