【发布时间】:2020-05-27 21:23:13
【问题描述】:
我有一个这样的模板类(带有动态数据):
template <class T>
class TemplateClass : public BaseClass {
public:
...
protected:
vector<T> data;
...
}
它是从 BaseClass 派生的,因为在另一个容器类中,我必须将所有这些模板类都放在同一个向量中:
class Container{
public:
...
protected:
vector<BaseClass*> elements;
}
这样我可以在同一个向量中有不同的类型,并调用 TemplateClass 方法,只需执行 dynamic_cast(ej dynamic_cast<TemplateClass<int>*>(elements[i])->method(a)("a" 将是一个整数))。
它可以工作(程序运行)但它不能说服我,因为当我销毁容器时,我必须显式调用 TemplateClass 的析构函数,因为 BaseClass 不会破坏数据(向量):
delete dynamic_cast<TemplateClass<int>*>(elements[i])
我想使用 unique_pointer 但我认为它不起作用,因为它不会删除数据(因为将调用 BaseClass 析构函数而不是 TemplateClass 析构函数并且 BaseClass 不能具有此模板向量)。
有没有其他选择?我必须有这个 TemplateClass 向量。
谢谢你
【问题讨论】:
-
相关,考虑改用
std::vector<std::shared_ptr<BaseClass>>,并通过std::make_shared管理其中的元素。然后,您可以在父级销毁时完全放弃手动容器枚举(假设您采用下面的答案并在基础中提供虚拟 dtor,它将为您妥善处理)。
标签: c++ templates inheritance