Подтвердить что ты не робот

В чем цель чистого виртуального деструктора?

Возможные дубликаты:
При каких обстоятельствах выгодно давать реализацию чистой виртуальной функции?
Зачем нужен чистый виртуальный деструктор в С++?

Компилятор не заставляет Child class реализовать деструктор, когда его Base имеет чистый деструктор virtual.

struct Base
{
  virtual void foo () = 0;
  virtual ~Base() = 0;
};
Base::~Base() {} // necessary

struct Child : Base
{
  void foo() {}
  //ok! no destructor needed to create objects of 'Child'
};

Смешная часть такова; компилятор скорее вынуждает Base определять тело деструктора. Это понятно. (Демо для справки)

Тогда какова цель с чистым дескриптором virtual в классе Base? (Можно ли запретить создание Base объектов?)

4b9b3361

Ответ 1

Иногда абстрактный базовый класс не имеет виртуальных методов (= часто называется "mixin" ) или вообще не существует (= часто называется тегом типа).

Чтобы заставить эти классы использоваться как абстрактные базовые классы, по крайней мере один метод должен быть чистым виртуальным, но классы не имеют виртуальных методов! Таким образом, мы делаем деструктор чистым виртуальным.

Ответ 2

Это делает класс абстрактным. Существование хотя бы чистого виртуального метода достаточно, чтобы класс был абстрактным.

Ответ 3

Если у вас нет других чистых виртуальных функций в Base, вы можете сделать деструктор чистым виртуальным, чтобы базовый класс был абстрактным.

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


Хорошо, возможно, я мог бы сформулировать это лучше. Второй абзац отвечает:

Компилятор не заставляет Child class реализовать деструктор, когда его Base имеет чистый virtual деструктор.

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

Ответ 4

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

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