【发布时间】:2011-05-19 17:22:09
【问题描述】:
具有高类层次结构的运行时缺点是什么?
我们将H称为层次结构的高度(即:从基类到叶子要遍历多少类)。
dynamic_cast 将花费更多:它花费O(H)。
是否有其他运算符或语言功能受到影响?
【问题讨论】:
-
开发人员算不算“运营商”?他们会受苦的:)
标签: c++ class inheritance height hierarchy
具有高类层次结构的运行时缺点是什么?
我们将H称为层次结构的高度(即:从基类到叶子要遍历多少类)。
dynamic_cast 将花费更多:它花费O(H)。
是否有其他运算符或语言功能受到影响?
【问题讨论】:
标签: c++ class inheritance height hierarchy
叶类对象的构造和销毁需要更长的时间,因为层次结构中的所有构造函数都被调用(从基类到叶类)。
【讨论】:
struct X : Y {}; 可能生成与struct X { Y y; };(或struct X {}; Y y;,FTM)完全相同的代码。我认为这是 ybungalobill 批评的核心。
所有的操作都可以在 O(1) 时间内完成,通常都是,除了dynamic_cast。对于静态链接库,最后一个可以在 O(1) 时间内实现,请参阅here。
【讨论】:
主要问题是可维护性。深层类层次结构可能没有正确建模。任何超过 3-4 个级别的内容都应该让您警觉。您可能是从具体类派生的,这是您永远不应该做的事情(Liskov Substitution principle 不允许这样做)。如果您的基类中充斥着virtual 函数(我的意思是不是纯粹的),那么重构将会很困难。
将您的基类拆分为几个不同的接口 (Interface Segregation)。更喜欢组合而不是继承(软件设计的 GoF fundamental rule)。
个人建议:尝试在没有dynamic_cast 的情况下进行编程。当我还是 C++ 开发人员时,我能够在没有 dynamic_cast 的情况下完全编程。我在适当的地方使用了设计模式、工厂、visitors 等。没有演员表,生活会简单得多:-)。
祝你好运!
【讨论】:
dynamic_cast,但我试图找出 C++ 特性的成本取决于层次结构的高度。 tall 类也不常见(也是不好的做法),除非您经常使用模板;例如查看boost::operators。
virtual 方法,不能用作传统的基类。我可能会在一边继承它们(使用多重继承),因为它们是空基,我们可以在这里希望 EBO。