我有一组类,它们都是从一个公共基派生的。我需要一个集合(可能是list
),它将包含各种类型的派生类的实例。类操作将在集合中的实例上调用虚拟方法。当然,我不能使用list<Base>
,因为按值持有基类会对派生类进行切片。
显而易见的解决方案是使用list<Base*>
并将其封装在一个具有复制构造函数、析构函数等的类中。基类将具有一个虚拟duplicate
函数,该函数在每个派生类中重载,以返回指向该派生类的复制构造的新实例的指针。析构函数必须遍历列表,并遍历每个项的delete
。
如果有Boost方法可以做到这一点,那也没关系。我已经在使用Boost了。在我看来,使用Boost的共享指针将是最好的方式。管理共享引用计数会有开销,但这必须比指针情况下所需的分配/复制成本更低。但是,这意味着集合的副本将导致相同的实例,并且更改一个副本将更改另一个副本。
我还不完全知道如何实际使用这些代码。所以我不确定共享副本语义是否会成为一个问题。我不认为复印件会很常见,只需要理智地处理。
还有别的办法吗?
向Boost.PointerContainer问好。默认情况下,当您复制容器时,这些容器提供深度复制语义(但这是可定制的)。请注意,您需要在适当的命名空间中为抽象基类实现一个免费的new_clone
方法。
此外,作为附带说明,请使用std::vector
作为首选容器。
另一个注意事项是,不要将container<Base*>
封装起来,而是将Base*
封装在一个智能指针中。如果您不希望共享所有权,C++11提供unique_ptr
。unique_ptr
只允许移动,不能复制。