Почему деструктор по умолчанию для абстрактного класса не является виртуальным?

Рассматривать

class A
{
public:
virtual void foo () = 0;
};

На данный момент совершенно очевидно, что A является абстрактным классом и никогда не будет создан сам по себе. Так почему же стандарт не требует, чтобы автоматически создаваемый деструктор также был виртуальным?

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

Итак, вопрос: почему созданный деструктор в абстрактном классе не является виртуальным?

8

Решение

Потому что в C ++ вы не платите за то, что вам не нужно, а виртуальный деструктор добавляет издержки (даже в уже полиморфных классах), которые не нужны во многих случаях. Например, вам может не понадобиться полиморфное разрушение, и вместо этого вы захотите иметь защищенный деструктор.

Далее, в качестве альтернативного сценария представьте, что у вас есть класс с виртуальным методом, который делает Желание полиморфного разрушения. Теперь представьте, что другой virtual метод больше не нужен и удален, но полиморфное разрушение все еще необходимо. Теперь вы должны помнить, чтобы вернуться и добавить виртуальный деструктор или перенести неопределенное поведение.

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

8

Другие решения

Виртуальный деструктор будет вызывать разыменование каждый раз, когда этот класс будет уничтожен. Довольно небольшие накладные расходы, но C ++ хочет сэкономить как можно больше времени. В любом случае, быть явным всегда лучше, чем доверять неявной магии компилятора.
Девиз C ++: «Доверься программисту».

LG Ntor

0

Когда был написан стандарт c ++, он был написан с учетом того, что он будет использоваться на различных платформах. Некоторые из них могут иметь ограничения памяти. Добавляя virtual-ism, мы увеличиваем накладные расходы. Вот почему в этот момент программист должен явно делать каждый метод / dtor виртуальным, когда нам требуется полиморфизм.

Теперь возникает вопрос, почему не может стандартная с ++ реализация абстрактного класса по умолчанию для деструктора. Разве вы не думаете, что будет странно иметь другую реализацию, а также это вызовет путаницу. А как насчет случая (каким бы маленьким он ни был), когда вам не нужно, чтобы distructor был virtaul (чтобы сохранить память). объем памяти

0
По вопросам рекламы [email protected]