拥有所有派生自同一基类的类实例集合的最佳方法是什么?



我有一组类,它们都是从一个公共基派生的。我需要一个集合(可能是list),它将包含各种类型的派生类的实例。类操作将在集合中的实例上调用虚拟方法。当然,我不能使用list<Base>,因为按值持有基类会对派生类进行切片。

显而易见的解决方案是使用list<Base*>并将其封装在一个具有复制构造函数、析构函数等的类中。基类将具有一个虚拟duplicate函数,该函数在每个派生类中重载,以返回指向该派生类的复制构造的新实例的指针。析构函数必须遍历列表,并遍历每个项的delete

如果有Boost方法可以做到这一点,那也没关系。我已经在使用Boost了。在我看来,使用Boost的共享指针将是最好的方式。管理共享引用计数会有开销,但这必须比指针情况下所需的分配/复制成本更低。但是,这意味着集合的副本将导致相同的实例,并且更改一个副本将更改另一个副本。

我还不完全知道如何实际使用这些代码。所以我不确定共享副本语义是否会成为一个问题。我不认为复印件会很常见,只需要理智地处理。

还有别的办法吗?

向Boost.PointerContainer问好。默认情况下,当您复制容器时,这些容器提供深度复制语义(但这是可定制的)。请注意,您需要在适当的命名空间中为抽象基类实现一个免费的new_clone方法。

此外,作为附带说明,使用std::vector作为首选容器。

另一个注意事项是,不要将container<Base*>封装起来,而是将Base*封装在一个智能指针中。如果您不希望共享所有权,C++11提供unique_ptrunique_ptr只允许移动,不能复制。

相关内容

  • 没有找到相关文章

最新更新