可能重复:
是否可以从 STL 容器继承实现而不是委托?
我的问题与为什么 STL 容器没有虚拟析构函数有关?有些人(包括前一个问题的作者)确信没有虚拟 dtor 意味着类不可继承。我对如此强烈的声明持怀疑态度,因此我询问了来源或一些推理,但大多数受访者保持沉默。也没有人回应我的回答
所以我认为质疑前一个问题中的假设并澄清这个重要问题是个好主意。STL 容器是否设计为允许继承?更一般地说:继承需要虚拟析构函数吗?
可能重复:
是否可以从 STL 容器继承实现而不是委托?
我的问题与为什么 STL 容器没有虚拟析构函数有关?有些人(包括前一个问题的作者)确信没有虚拟 dtor 意味着类不可继承。我对如此强烈的声明持怀疑态度,因此我询问了来源或一些推理,但大多数受访者保持沉默。也没有人回应我的回答
所以我认为质疑前一个问题中的假设并澄清这个重要问题是个好主意。STL 容器是否设计为允许继承?更一般地说:继承需要虚拟析构函数吗?
STL 容器是否设计为允许继承?
标准库容器允许继承。没有什么能阻止您从标准库容器类继承。如果这样做,您将不会收到任何编译错误。
但是它们的设计目的不是为了允许通过基类指针破坏派生类对象。因此,如果您想在这种情况下使用继承(简称动态多态),那么标准库容器显然不是为它设计的。
继承需要虚拟析构函数吗?
仅当您打算调用delete
指向派生类对象的基类指针时,基类析构函数才需要是虚拟的。如果基类析构函数不是虚拟的,它将导致未定义的行为。
所以总结一下,规则是:
如果您需要继承动态多态标准库容器类不是为它设计的,但如果您不需要,您可以安全地从它们继承。
注意:您在您提供的答案链接中的分析是正确的。它只是没有得到回应,可能是因为答案是在原始 Q 发布后很长时间(几年)发布的。你现在有我的 +1。