虚拟基类是否是可行和/或有用的功能
Are Virtual Base classes a workable and or useful feature
我知道虚拟基类机制的存在是为了防止"钻石"问题。但我很好奇,重新设计类层次结构是否不能更好地处理这种情况。以下面的情况为例:从这里复制
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
继承,他们可能会喜欢能够覆盖你的成员函数。 我们不这样做,因为对于基类virtual
,virtual
成员函数都有与之相关的额外成本(时间/资源开销和复杂性)。
虚拟继承是所有具有多重继承功能的语言中的必备功能。尽管可能所有继承案例都是虚拟的,但这具有:
- 额外费用
- 并不总是预期的结果
这是因为虚拟继承是继承的一种特例,其中继承的是直接派生类的指令,而不是类本身。结果,虚拟派生另一个类的每个基类都会将此虚拟基作为直接基类提供给每个下一个派生类。当然,如果多个基类提供相同的虚拟基类,则会导致派生类派生一次,但这是因为这些多个基类提供多个派生指令,但一个类(与正常继承相反,在这种情况下,基类将提供基类的多个子对象)。
它始终是直接基类这一事实的结果是,它要求在每个下一个派生类中显式构造它。当然,默认构造函数规则适用,但在此规则中甚至不C++结果 - 接受基类初始化虚拟基的代码;唯一被拒绝的情况是虚拟基在多个基类中"竞争性初始化"时 - 在这种情况下,您必须通过提供构造规范来"解决冲突"。
请不要因为蹩脚的自我推销而敲打我,但我在这里更详细地描述了这个话题:
https://sektorvanskijlen.wordpress.com/2010/12/08/multiple-inheritance-considered-nice
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 虚拟基类是否是可行和/或有用的功能
- 既然其他可滥用但有用的功能已经标准化了,为什么不#pragma一次呢
- 在boost中学习的有用功能可以立即使用