虚拟基类是否是可行和/或有用的功能

Are Virtual Base classes a workable and or useful feature

本文关键字:有用 功能 基类 是否是 虚拟      更新时间:2023-10-16

我知道虚拟基类机制的存在是为了防止"钻石"问题。但我很好奇,重新设计类层次结构是否不能更好地处理这种情况。以下面的情况为例:从这里复制

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};

我看到现在存在的机制的问题是,你需要能够预测某人会出现并从B和C继承。所以不是说我们最好用虚拟标记每个遗产吗?

A的虚拟继承意味着

  • A必须在派生最多的类中初始化,并且
  • A事物的访问效率会降低(因为A子对象可以在多个派生类对象之间共享,因此可以在每个派生类对象中处于动态偏移量)。

出于这些原因,使用虚拟继承时要小心。

一个好的经验法则是对接口使用虚拟继承,而不是对实现类使用虚拟继承。

你可以在virtual成员函数上争论同样的观点——为什么不让所有成员函数都virtual,因为如果有人出现并从你的class继承,他们可能会喜欢能够覆盖你的成员函数。 我们不这样做,因为对于基类virtualvirtual成员函数都有与之相关的额外成本(时间/资源开销和复杂性)。

虚拟继承是所有具有多重继承功能的语言中的必备功能。尽管可能所有继承案例都是虚拟的,但这具有:

  • 额外费用
  • 并不总是预期的结果

这是因为虚拟继承是继承的一种特例,其中继承的是直接派生类的指令,而不是类本身。结果,虚拟派生另一个类的每个基类都会将此虚拟基作为直接基类提供给每个下一个生类。当然,如果多个基类提供相同的虚拟基类,则会导致派生类派生一次,但这是因为这些多个基类提供多个派生指令,但一个类(与正常继承相反,在这种情况下,基类将提供基类的多个子对象)。

始终是直接基类这一事实的结果是,它要求在每个下一个派生类中显式构造它。当然,默认构造函数规则适用,但在此规则中甚至不C++结果 - 接受基类初始化虚拟基的代码;唯一被拒绝的情况是虚拟基在多个基类中"竞争性初始化"时 - 在这种情况下,您必须通过提供构造规范来"解决冲突"。

请不要因为蹩脚的自我推销而敲打我,但我在这里更详细地描述了这个话题:

https://sektorvanskijlen.wordpress.com/2010/12/08/multiple-inheritance-considered-nice