在C++中,我应该几乎总是使用虚拟继承吗?

Sup*_*ric 25 c++ multiple-inheritance virtual-inheritance

我从这个条目中看到虚拟继承将sizeof(指针)添加到对象的内存占用.除此之外,默认情况下使用虚拟继承是否有任何缺点,只有在需要时才使用常规继承?这似乎会带来更具前瞻性的课堂设计,但也许我错过了一些陷阱.

Ale*_*x B 23

缺点是

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

单独的第1点使它不值得,因为你无法隐藏你的虚拟基地.几乎总有一种更好的方法.

  • 像"它不值得"之类的评论表明完全无法理解虚拟基础的目的:当你对抽象进行子类化时,必须始终*使用虚拟继承.没有解决方法或其他可能性,如果您未能使用它,您不能使用抽象的多个子类而不返回并修复您的设计错误,从而破坏封装. (3认同)
  • @Yttrill @SuperElectric"它不值得"我的意思是让你自己进入一个你需要多个虚拟继承的情况.到目前为止,您的设计过于复杂.至于第(2)点,它不会用`static_cast`编译. (2认同)
  • @AlexB 我不明白(1)。所有类都不会一直初始化其所有基类(非虚拟基类)? (2认同)

Gre*_*ill 13

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

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

  • 另一个可能的答案是虚拟继承使您的代码更难阅读.对于那些不经常遇到虚拟继承的人来说,他们必须了解它并应用额外的认知负担,记住每次阅读代码时的含义.对于那些*了解它的人,如果你的类没有实际使用钻石继承,他们会想知道你为什么使用不必要的功能.在这种情况下,[YAGNI](http://en.wikipedia.org/wiki/You_ain't_gonna_need_it)原则适用. (3认同)
  • 嗯...我已经知道它的用途(我正在考虑使用它),并且我知道它很少见(我用 C++ 编写代码),但提出的问题是“虚拟继承的缺点是什么”。 (2认同)