有谁知道为什么STL容器没有虚拟析构函数?为什么STL容器没有虚拟析构函数?
据我所知,唯一的好处是:
- 它由一个指针(到虚拟方法表)和
- 减少一个实例的大小它使破坏和结构的小位更快。
缺点是以通常的方式子集化容器是不安全的。
编辑: 也许我的问题可以改写为什么不是STL容器设计允许继承?
因为它们不支持继承,所以当想要有一个需要STL功能的新容器加上少量附加功能时(例如,使用默认值的专门构造函数或新访问器对地图,或其他):
- 组成和接口复制:使拥有该STL容器作为私有成员,每种方法STL的一个交叉联方法一个新的模板或类。这与继承一样有效,避免了虚拟方法表(在重要的情况下)的成本。不幸的是,STL容器有相当宽泛的接口,所以这需要许多代码来完成一些看起来应该很容易的事情。
- 只是使功能:使用裸(可能模板化)文件范围的功能,而不是尝试添加成员函数。在某些方面,这可能是一个很好的方法,但封装的好处将会丢失。
- 具有公共STL访问的组合:让STL容器的所有者允许用户访问STL容器本身(可能通过访问者保护)。这需要库编程人员的最少编码,但对用户来说不太方便。组合的最大卖点之一是可以减少代码中的耦合,但是该解决方案将STL容器与所有者容器完全耦合(因为所有者返回了真正的STL容器)。
- 编译时多态性:写操作可能有点棘手,需要一些代码体操,并且不适合所有情况。
作为一个方面的问题:是否有与非虚析构函数(我们假设我不希望覆盖任何方法,只是我要添加新的)继承的标准安全方式?我的印象是,如果没有能力改变定义非虚拟类的代码,那么没有通用的和安全的方法来做到这一点。
编辑2:
作为@doc points out,C++ 11的发烧友using
声明低的组合物的成本有所。
你错过的 “它不鼓励使用继承不当程序员” 的好处。从STL容器继承可能有一个合理的理由,但我从来没有找到过。 – Tom 2009-10-30 03:14:25
并回答你的问题:'喜欢组成继承'。 – 2009-10-30 07:22:39
你为什么想要继承它? – jalf 2009-10-30 12:03:06