30

我从这个条目中看到,虚拟继承将 sizeof(pointer) 添加到对象的内存占用中。除此之外,默认情况下仅使用虚拟继承和仅在需要时使用常规继承对我有什么缺点吗?似乎它会导致更多面向未来的类设计,但也许我错过了一些陷阱。

4

2 回答 2

25

缺点是

  1. 所有类都必须始终初始化其所有虚拟基(例如,如果 A 是 B 的虚拟基,并且 C 派生自 B,它也必须初始化 A 本身)。
  2. 您必须在dynamic_cast使用 a 的任何地方使用更昂贵的static_cast(可能是也可能不是问题,取决于您的系统以及您的设计是否需要它)。

仅第 1 点就不值得,因为您无法隐藏虚拟基地。几乎总是有更好的方法。

于 2010-12-28T04:02:05.937 回答
16

根据我的经验,几乎不需要虚拟继承(与虚拟方法相反)。在 C++ 中,它用于解决“钻石继承问题”,如果避免多重继承,则实际上不会发生这种问题。

我很确定我从未在 C++ 书籍之外遇到过虚拟继承,其中包括我编写的代码和我维护的数百万行系统。

于 2010-12-28T03:53:08.853 回答