【发布时间】:2012-03-13 05:38:34
【问题描述】:
我有一个类的集合,这些类都派生自一个共同的基础。我需要一个集合(可能是list)来保存各种类型的派生类的实例。类操作将调用集合中实例的虚拟方法。当然,我不能使用list<Base>,因为按值保存基类会切片派生类。
显而易见的解决方案是使用list<Base*> 并将其包装在具有复制构造函数、析构函数等的类中。基类将有一个虚拟的duplicate 函数,该函数在每个派生类中被重载,以返回指向该派生类的复制构造的新实例的指针。析构函数必须遍历列表和delete 每个项目。
如果有 Boost 方法可以做到这一点,那很好。我已经在使用 Boost 了。在我看来,使用 Boost 的共享指针将是最好的方法。管理共享引用计数会有开销,但这必须比指针情况下所需的分配/复制便宜。但是,这意味着集合的副本将产生相同的实例,并且更改一个副本将更改另一个副本。
我还不完全知道这段代码将如何实际使用。所以我不确定共享副本语义是否会成为问题。我认为副本不会很普遍,它们只需要谨慎处理即可。
还有其他方法吗?
【问题讨论】:
-
如果对象不重,则首先尝试 boost 指针容器,否则尝试使用 boost::shared_ptr 的 STL 容器(向量、列表等)
标签: c++ inheritance boost collections smart-pointers