Разве размещение «виртуального деструктора внутри интерфейса» не делает его по определению больше не интерфейсом?

Итак, вот ящик, в котором я нахожусь. Я хочу понять, почему так важно иметь "виртуальный деструктор внутри". интерфейсный класс ". Вы поймете, почему этот материал заключен в кавычки, если можете довести его до конца ... Я также хочу, чтобы весь словарный запас был абсолютно правильным. Вот где я нахожусь в процессе:

  1. Иногда у вас есть базовые классы, иногда у вас есть производные классы, которые наследуются от базовых классов.

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

  3. Интерфейс - это любой класс с только чистыми виртуальными функциями. Если вы унаследуете новый класс от этого класса интерфейса и реализуете все чистые виртуальные функции, то, наконец, вы сможете создать экземпляр производного класса.

  4. У вас никогда не может быть экземпляра класса интерфейса, НО у вас может быть экземпляр класса указателя на интерфейс.

  5. В случае, когда у вас есть класс указателя на интерфейс, который фактически указывает к объекту производного класса (на самом деле, я думаю, это всегда должно быть, если номер 4 правильный), и если вы решите удалить этот объект с помощью указателя, то если у вас нет «виртуального деструктора внутри вашего интерфейса» class ", ваше намерение уничтожить производный объект будет выполнено только как вызов для уничтожения базового объекта (то есть класса интерфейса), и поскольку нет виртуального деструктора, вещи никогда не дойдут до того момента, когда деструктор для фактически вызывается производный объект, что вызывает утечку памяти.

Уф. Хорошо, если это звучит правильно, на мой вопрос. Достаточно ли просто объявить виртуальный деструктор внутри вашего интерфейса следующим образом:

virtual ~iFace();

Мне это кажется неправильным ... Итак, что произойдет, если вы сделаете деструктор чистым виртуальным следующим образом:

virtual ~iFace() = 0;

Поскольку они являются просто объявлениями, сделайте либо из них считается «виртуальным деструктором внутри вашего класса интерфейса»? Можете ли вы иметь объявленный, но не определенный деструктор? Только если он будет чисто виртуальным, я бы предположил ...

В любом случае, возвращаясь к вопросу о названии ... Я действительно иду так быстро, как могу ... Вот вам удача ... Если ваш " виртуальный деструктор внутри вашего интерфейсного класса "требует по крайней мере пустого определения вроде этого:

virtual ~iFace() {};

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

Это будет означать, что если вы определите виртуальный деструктор для своего интерфейса, тогда у вас больше не будет интерфейса (а только некоторый абстрактный базовый класс). Это просто злоупотребление языком? Понимаю ли я, что происходит?

примечание: Все это произошло из-за того, что я спросил себя: «Что такое интерфейс?» а затем прочтите ответы на этот вопрос: Как вы объявляете интерфейс на C ++?

Надеюсь, что это не слишком длинная прогулка для слишком короткой поездки, но я полон решимости полностью понять эти концепции и связанный с ними словарь .

26
задан Community 23 May 2017 в 12:02
поделиться