![]() |
1
29
虚拟析构函数仅对继承场景有用。STL容器的设计目的不是从中继承(也不是受支持的方案)。因此,它们没有虚拟析构函数。 |
![]() |
2
18
我认为斯特劳斯特鲁普在他的精彩论文中间接地回答了这个问题: Why C++ is not just an ObjectOriented Programming Language :
通用编程+函数样式+数据抽象==STL样式 . 这并不奇怪,OOP是最重要的,而不是最重要的 表示数据结构的方法&算法库。虽然OOP用于标准库的其他部分,但STL的设计者发现,上述三种技术的混合比OOP更好 单独地 . 简而言之,这个库不是用OOP设计的,在C++中,如果你不使用它,它就不会与你的代码捆绑在一起。你不用的东西你不用付钱。类std::vector、std::list、,。。。是 不 抽象数据类型 以最好的解释。 |
![]() |
3
14
我想这是遵循C++哲学的,你不为不使用的功能付费。根据平台的不同,如果您不关心虚拟析构函数,那么虚拟表指针可能是一个巨大的代价。 |
![]() |
4
8
为什么STL容器的设计不允许继承?
依我拙见,他们是。如果他们不愿意,他们已经被制造出来了
. 当我看到
它不会用吗 私有的 如果子类化不受欢迎,是否继承?
为什么不使用
这种方法确保类的用户不会将实例向上转换为
…我也有一个松散的想法,如果你的类没有析构函数,你甚至可以公开继承。异端 |
![]() |
5
1
|
![]() |
6
1
另一个能够从STL容器生成子类的解决方案是Bo-Qian使用智能指针给出的解决方案。 Advanced C++: Virtual Destructor and Smart Destructor
这避免了使用虚拟析构函数的难题。 |
![]() |
7
0
正如已经指出的,STL容器的设计不是为了可继承。没有虚拟方法,所有数据成员都是私有的,没有受保护的getter/setter/helper。。正如你所发现的,没有虚拟析构函数。。
|
![]() |
8
-2
没有虚拟析构函数阻止类正确地成为子类。 |
![]() |
9
-2
如果您确实需要虚拟析构函数,可以将其添加到从vector派生的类中<>,然后在任何需要虚拟接口的地方使用这个类作为基类。通过这样做,编译器将从基类调用虚拟析构函数,而基类又将从向量类调用非虚拟析构函数。 例子:
此代码提供以下输出:
|
![]() |
Arnish Grover · 为什么这里两次调用析构函数?[副本] 7 年前 |
![]() |
hvertous · 在析构函数方法中引发异常 7 年前 |
![]() |
Phi Truong · 链表析构函数C++ 7 年前 |
![]() |
allo · C++程序挂起在向量析构函数中 7 年前 |
|
user8185371 · 释放对象的内存与终止内务管理? 7 年前 |
![]() |
Peter Hwang · 销毁列表结构的全局数组 7 年前 |