Подтвердить что ты не робот

Если интерфейсы С++ имеют виртуальный деструктор

Возможный дубликат:
Деструкторы для классов интерфейса С++

Рассмотрим простой пример абстрактного класса С++, используемый для моделирования интерфейса:

class IAnimal
{
  virtual void walk()=0;
  virtual ~IAnimal(){}
};

Лучше ли иметь деструктор или нет? Я не думаю, что деструктор может быть чистым виртуальным, по крайней мере, мои тесты дают ошибки компоновщика, поэтому должен быть включен пустой деструктор?

EDIT: извините, опечатка. Это деструктор, а не конструктор.

4b9b3361

Ответ 1

Вы всегда должны использовать виртуальный деструктор с интерфейсами. Пример:

IAnimal* animal = new Lion();
delete animal;

Теперь, какой деструктор он собирается использовать? Определенно не деструктор Lion, потому что интерфейс не знает о деструкторе Lion.

Итак, имейте это, если ваш интерфейс не имеет управления памятью:

virtual ~IAnimal(){}

Ответ 2

Отъезд this aricle from Herb Sutter

Особенно

Для частного случая деструктора только:

Руководство № 4: деструктор базового класса должны быть либо публичными, либо виртуальными, или защищенных и не виртуальных.

Это предполагает, что базовый класс является классом "интерфейса", поскольку он в основном должен быть.

Ответ 3

Это зависит от того, собираетесь ли вы полиморфно управлять временем жизни объектов, используя указатели на класс интерфейса.

Если вы это сделаете, деструктор должен быть виртуальным, чтобы правильно удалить объекты. Удаление указателя базового класса, не имеющего виртуального деструктора, является недопустимым и дает поведение undefined.

Если вы этого не сделаете, вы должны обеспечить это, сделав деструктор не виртуальным и защищенным, поэтому можно удалить только производные классы.

Ответ 4

Я думаю, что это должен быть чистый виртуальный деструктор для интерфейсов, и все остальные методы также являются чисто виртуальными.

Ответ 5

вероятно, должен быть включен пустой конструктор, поскольку типичное использование интерфейса предполагает поместить указатель на какой-либо конкретный объект в контейнер, который иначе вызовет неправильный деструктор и не будет корректно очищать память. поэтому, если кто-то собирается удалить производные объекты с помощью указателя на Ianimal, создайте виртуальный деструктор, иначе сделайте ваш деструктор неживым и защищенным. что делает ваш деструктор чистым виртуальным, вероятно, не такая хорошая идея, поскольку он заставляет исполнителей производных классов переопределять ваш деструктор, хотя они могут ничего не делать

Ответ 6

Единственная причина, по которой виртуальный деструктор не должен сделать виртуальное, - это сохранить пространство, необходимое для vptr. Поскольку вам нужен vptr, так как у вас есть еще одна виртуальная функция, я бы сделал деструктор виртуальным.