关于c ++:为什么使用Boost.Intrusive容器来存储多态对象呢?

Why is it fine to use Boost.Intrusive containers to store polymorphic objects?

这是一条经常重复的建议,即不要从具有非虚拟析构函数的类继承(如果目的是使用动态多态性的话)。这就是为什么从标准容器类继承被认为是一个坏主意的原因。

另一方面,boost.invigative明确地声明其容器适合存储多态对象。在链接的例子中,这是通过从没有虚拟析构函数的boost::intrusive::list_base_hook<>派生而来的,并且只在派生类中引入一个析构函数。

  • 这是一个有效的设计吗?
  • 如果是这样,它为什么和如何符合我上面提到的一般建议?我特别指出,为什么同样的逻辑不能证明从标准容器继承的合理性?
  • (注意,我的问题不是关于标准容器和Boost.侵入性容器之间的区别。我对boost的正确用法很感兴趣。这很有意思,但我只举标准容器为例,因为在讨论类似主题时,它们经常会出现。)


    只有当使用派生类涉及通过指向基类的指针对对象的所有权时,才不应该从具有非虚拟析构函数的类继承。标准容器类没有什么特别的。从它们继承并不是一个坏主意,但问题是,扩展它们功能的其他方法应该是首选的:添加一个独立的函数或聚合。

    boost::intrusive::list_base_hook<>派生是完全有效的设计,因为派生对象的所有权从未通过指向list_base_hook的指针持有。请注意,库提供了通过聚合(使用list_member_hook进行连接),这应该比继承更好。