виртуальный дескриптор на чистом абстрактном базовом классе - PullRequest
10 голосов
/ 26 июля 2010

у меня

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

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

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

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

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

Ответы [ 2 ]

21 голосов
/ 26 июля 2010

В соответствии со спецификацией C ++, да.

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

    IMyInterface * ptr = getARealOne();
    delete ptr;

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

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

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

3 голосов
/ 26 июля 2010

Если вы не объявляете виртуальный 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...