Итак, вот я в коробке. Я хочу понять, почему важно иметь "виртуальный деструктор внутри вашего класса интерфейса". Вы увидите, почему этот материал находится в кавычках, если вы можете повесить до конца... Я также хочу, чтобы весь словарь был абсолютно правильным. Вот где я нахожусь с процессом до сих пор:
-
Иногда у вас есть базовые классы, иногда у вас есть производные классы, которые наследуются от базовых классов.
-
Если у вас есть базовый указатель, который обнаруживает, что он указывает на производный объект, и, кроме того, вы хотите, чтобы вызов функции-члена, сделанный из этого объекта-указателя-указателя-к-производному, вел себя так, как если бы он фактически был вызван из производного объекта, то функция-член, которую вы вызываете, должна быть объявлена виртуальной в базовом классе.
-
Интерфейс - это любой класс с только чистыми виртуальными функциями. Если вы выведете новый класс из этого класса интерфейса и реализуете все чистые виртуальные функции, вы можете, наконец, создать экземпляр производного класса.
-
У вас никогда не может быть экземпляра класса интерфейса, но вы можете иметь экземпляр класса-указателя-интерфейса.
-
В случае, если у вас есть класс-указатель-интерфейс, который фактически указывает на объект производного класса (на самом деле, я думаю, он всегда должен был бы, если бы # 4 был правильным), и если вы решили удалить этот объект через ваш указатель, тогда, если у вас нет "виртуального деструктора внутри вашего класса интерфейса", ваше намерение уничтожить производный объект будет выполняться только как вызов для уничтожения базового объекта (т.е. класса интерфейса), и поскольку нет виртуальный деструктор, вещи никогда не дойдут до такой степени, что деструктор для производного объекта фактически вызван, что вызывает утечку памяти.
Уф. Хорошо, если это звучит правильно, на мой вопрос. Достаточно ли просто объявить виртуальный деструктор внутри вашего интерфейса следующим образом:
virtual ~iFace();
Это выглядит неправильно для меня... так что произойдет, если вы сделаете деструктор чистым виртуальным, как это:
virtual ~iFace() = 0;
Поскольку они являются просто декларациями, выполните одно из этих значений для того, чтобы быть "виртуальным деструктором внутри вашего класса интерфейса"? У вас даже есть объявленный, но не определенный деструктор? Только если это чисто виртуальный, я бы догадался...
Во всяком случае, так что вернемся к титульному вопросу... Я действительно иду так быстро, как только могу... Вот деньги сняли... Если ваш "виртуальный деструктор внутри вашего класса интерфейса" требует хотя бы пустого определения, подобного этому:
virtual ~iFace() {};
Тогда эта функция-член не является чистой виртуальной (не может быть потому, что вы дали ей определение), и поэтому ваш класс больше не является интерфейсом (он не только содержит чистые виртуальные функции-члены).
Это означало бы, что если вы определяете виртуальный деструктор для вашего интерфейса, то у вас больше нет интерфейса (а всего лишь абстрактного базового класса). Это просто злоупотребление языком? Я понимаю, что происходит?
Примечание. Все это объясняется вопросом: "Что такое интерфейс?" а затем, прочитав этот вопрос, ответьте: Как вы объявляете интерфейс в C++?
Надеюсь, что это была не слишком длинная прогулка для слишком короткой поездки, но я решил полностью понять эти концепции и связанные с ними словарный запас.