Деструктор унаследованного класса - PullRequest
0 голосов
/ 28 мая 2020
• 1000
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. Спасибо

1 Ответ

0 голосов
/ 28 мая 2020

Вам нужно создать деструктор BaseClass a virtual деструктора.

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

С этим изменением деструктор TemplateClass будет вызываться, когда вы delete объекты в Container::elements. В деструкторе TemplateClass вы можете delete динамически выделяемую память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...