виртуальный деструктор на чистом абстрактном базовом классе

Я имею

struct IMyInterface
{
   virtual method1() = 0;
   virtual method2() = 0;
};

GCC настаивает, чтобы я имел

struct IMyInterface
{
   virtual method1() = 0;
   virtual method2() = 0;
   virtual ~IMyInterface(){};
};

Я не вижу почему. Чистый интерфейс - все об интерфейсе (понятное дело). Деструктор является частью внутренних деталей реализации конкретного реализатора интерфейса; это не является частью интерфейса. Я понимаю целую проблему разрезания (или по крайней мере я думаю, что делаю),

Таким образом, мой вопрос - действительно ли GCC является правильным настоять на нем и раз так почему?

10
задан j0k 1 July 2013 в 14:08
поделиться

2 ответа

Согласно спецификации C ++, да.

Вам необходимо объявить деструктор виртуальным, потому что в противном случае

    IMyInterface * ptr = getARealOne();
    delete ptr;

не будет вызывать деструктор в производном классе (потому что деструктор не находится в VTable)

Он должен быть нечистым, потому что base деструкторы класса всегда вызываются деструктором подкласса.

Чтобы пояснить подробнее, C ++ не имеет такой концепции интерфейса, как Java или C #. Это просто соглашение использовать только чисто виртуальные методы и думать об этом как об интерфейсе. Другие правила, касающиеся деструкторов C ++, требуют, чтобы он был нечистым, что нарушает сходство с интерфейсами на других языках, но этих языков не существовало в то время, когда эти правила были созданы.

22
ответ дан 3 December 2019 в 16:28
поделиться

Если вы не объявляете виртуальный d'tor в базового класса, удаление объектов производных классов с помощью указателя на базовый класс приводит к вызову неправильного деструктора и, следовательно, к неопределенному поведению и утечке ресурсов.

struct A {

  virtual ~A() {}

};

struct B : A {

   std::string us_constitution;  
};


B* pb = new B();
A* pa = pb;

delete pa; // without the virtual d'tor in the base class, 'B::us_constitution' would never be freed.
3
ответ дан 3 December 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: