相关疑难解决方法(0)

为什么STL容器没有虚拟析构函数?

有谁知道为什么STL容器没有虚拟析构函数?

据我所知,唯一的好处是:

  • 它通过一个指针(到虚拟方法表)减少实例的大小
  • 它使破坏和构造更快一点.

缺点是以通常的方式对容器进行子类化是不安全的.

编辑: 也许我的问题可以改写"为什么不是STL容器设计允许继承?"

因为它们不支持继承,所以当有人想要一个需要STL功能的新容器加上少量的附加功能时(例如一个专门的构造函数或带有地图默认值的新访问器),就会遇到以下选择:管他呢):

  • 组合和接口复制:创建一个拥有STL容器作为私有成员的新模板或类,并为每个STL方法提供一个传递内联方法.这与继承一样高效,避免了虚方法表的成本(在重要的情况下).不幸的是,STL容器具有相当广泛的接口,因此这需要许多代码行,这看起来应该很容易.
  • 只需创建函数:使用裸(可能是模板化的)文件范围的函数,而不是尝试添加成员函数.在某些方面,这可能是一个很好的方法,但封装的好处将丢失.
  • 具有公共STL访问权限的组合:让STL容器的所有者允许用户访问STL容器本身(可能通过访问者保护).这需要编写库编写器的编码最少,但对用户来说却不太方便.一个用于组成的大卖点之一是,你减少代码耦合,但这种方法完全夫妇与业主容器STL容器(因为业主返回一个真正的STL容器).
  • 编译时多态性:编写可能有些棘手,需要一些代码体操,并不适合所有情况.

作为一个附带问题:是否存在一种使用非虚拟析构函数进行子类化的标准安全方法(让我们假设我不想覆盖任何方法,只是我想添加新方法)?我的印象是,如果没有能力更改定义非虚拟类的代码,则没有通用且安全的方法.

编辑2:

正如@doc所指出的那样,C++ 11的发言人using声明在一定程度上降低了作曲的成本.

c++ destructor stl

31
推荐指数
4
解决办法
7066
查看次数

标签 统计

c++ ×1

destructor ×1

stl ×1