首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >虚拟基类是一个可行或有用的特性吗?

虚拟基类是一个可行或有用的特性吗?
EN

Stack Overflow用户
提问于 2015-01-15 13:10:47
回答 3查看 132关注 0票数 0

我理解虚拟基类机制的存在是为了防止“钻石”问题。但我很好奇,如果重新设计类层次结构不能更好地处理这种情况。以以下案例为例:copied from here

代码语言:javascript
运行
复制
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};

我现在看到的机制存在的问题是,您需要能够预测某个人将从B和C继承过来吗?所以,这并不意味着我们最好用虚拟标记来标记每一个继承?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-15 13:22:13

A的虚拟继承意味着

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

出于这些原因,虚拟继承是谨慎使用的。

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

票数 3
EN

Stack Overflow用户

发布于 2015-01-15 13:23:32

您可以在virtual成员函数上提出同样的观点--为什么不将所有成员函数virtual设置为virtual,因为如果有人从您的class中继承了成员函数,那么他们可能希望能够覆盖您的成员函数。我们不这样做,因为对于virtual基类,virtual成员函数需要额外的成本(时间/资源开销和复杂性)。

票数 3
EN

Stack Overflow用户

发布于 2015-01-15 14:23:58

在所有具有多重继承特性的语言中,虚拟继承都是必须具备的特性.虽然有可能所有继承案例都是虚拟的,但这有:

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

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

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

请不要因为无能的自我推销而抨击我,但我在这里更详细地描述了这个话题:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27964234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档