Зачем нам нужен чистый виртуальный деструктор в C ++?

Если строка, которую вам нужно добавить, это SVG, и вы добавляете правильное пространство имен, вы можете проанализировать строку как XML и добавить к родительскому.

var xml = jQuery.parseXML('<circle xmlns="http://www.w3.org/2000/svg" cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>');
$("svg").append(xml.documentElement))
146
задан Motti 3 August 2009 в 05:51
поделиться

4 ответа

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

  2. Нет, достаточно старого обычного виртуального.

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

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

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

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

struct foo {
    virtual void bar() = 0;
};

void foo::bar() { /* default implementation */ }

class foof : public foo {
    void bar() { foo::bar(); } // have to explicitly call default implementation.
};
113
ответ дан 23 November 2019 в 22:21
поделиться

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

31
ответ дан 23 November 2019 в 22:21
поделиться

Если вы хотите создать абстрактный базовый класс:

  • тот не может быть создан (да, это лишнее с термином «абстрактный»!)
  • , но требует поведения виртуального деструктора (вы собираетесь переносить указатели на ABC, а не на производные типы, и удалять через них)
  • , но не требует какой-либо другой виртуальной диспетчеризации поведение для других методов (может быть других методов нет? Рассмотрим простой защищенный контейнер «ресурсов», которому нужны конструкторы / деструктор / присваивание, но не более того)

... это самый простой чтобы сделать класс абстрактным, сделав деструктор чисто виртуальным и предоставив для него определение (тело метода).

Для нашей гипотетической ABC:

Вы гарантируете, что он не может быть создан (даже внутри самого класса, поэтому частных конструкторов может быть недостаточно), вы получаете виртуальное поведение, которое хотите для деструктора, и вам не нужно искать и помечать другой метод, который не требует виртуальной диспетчеризации как «виртуальный».

18
ответ дан 23 November 2019 в 22:21
поделиться

1) Если вы хотите, чтобы производные классы выполняли очистку. Это редко.

2) Нет, но вы хотите, чтобы это было виртуально.

-2
ответ дан 23 November 2019 в 22:21
поделиться
Другие вопросы по тегам:

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