继承的类析构函数

Inherited class destructor

本文关键字:析构函数 继承      更新时间:2023-10-16

我有一个这样的模板类(带有动态数据(:

template <class T>
class TemplateClass : public BaseClass {
public:
...
protected:
vector<T> data;
...
}

它派生自 BaseClass,因为在另一个容器类中,我必须在同一向量中拥有所有这些模板类:

class Container{
public:
...
protected:
vector<BaseClass*> elements;
}

这样,我可以在同一向量中使用不同的类型,并调用 TemplateClass 方法只是执行dynamic_cast(例如dynamic_cast<TemplateClass<int>*>(elements[i])->method(a)("a"将是一个整数((。 它可以工作(程序运行(,但它不能说服我,因为当我销毁容器时,我必须显式调用 TemplateClass 的析构函数,因为 BaseClass 不会破坏数据(向量(:delete dynamic_cast<TemplateClass<int>*>(elements[i])我想使用unique_pointer但我认为它不起作用,因为它不会删除数据(因为将调用 BaseClass 析构函数而不是 TemplateClass 析构函数,并且 BaseClass 不能有这个模板向量(。 还有其他选择吗?我必须有这个模板类向量。 谢谢

你需要使BaseClass的析构函数成为virtual析构函数。

class BaseClass
{
virtual ~BaseClass() {}
};

通过该更改,当您delete中的对象时,将调用TemplateClass的析构函数Container::elements。在TemplateClass的析构函数中,您可以delete动态分配的内存。