Рассматривать
class A
{
public:
virtual void foo () = 0;
};
На данный момент совершенно очевидно, что A
является абстрактным классом и никогда не будет создан сам по себе. Так почему же стандарт не требует, чтобы автоматически создаваемый деструктор также был виртуальным?
Я задаю себе этот вопрос каждый раз, когда мне нужно определить фиктивный виртуальный десктуктор в моих классах интерфейса и не могу понять, почему комитет не сделал этого.
Итак, вопрос: почему созданный деструктор в абстрактном классе не является виртуальным?
Потому что в C ++ вы не платите за то, что вам не нужно, а виртуальный деструктор добавляет издержки (даже в уже полиморфных классах), которые не нужны во многих случаях. Например, вам может не понадобиться полиморфное разрушение, и вместо этого вы захотите иметь защищенный деструктор.
Далее, в качестве альтернативного сценария представьте, что у вас есть класс с виртуальным методом, который делает Желание полиморфного разрушения. Теперь представьте, что другой virtual
метод больше не нужен и удален, но полиморфное разрушение все еще необходимо. Теперь вы должны помнить, чтобы вернуться и добавить виртуальный деструктор или перенести неопределенное поведение.
Наконец, я думаю, что было бы трудно оправдать изменение виртуальности деструктора по умолчанию (и только он один) в зависимости от того, является ли класс полиморфным или нет, а не всегда и последовательно делает деструктор нетуртурным, если не требуется иное.
Виртуальный деструктор будет вызывать разыменование каждый раз, когда этот класс будет уничтожен. Довольно небольшие накладные расходы, но C ++ хочет сэкономить как можно больше времени. В любом случае, быть явным всегда лучше, чем доверять неявной магии компилятора.
Девиз C ++: «Доверься программисту».
LG Ntor
Когда был написан стандарт c ++, он был написан с учетом того, что он будет использоваться на различных платформах. Некоторые из них могут иметь ограничения памяти. Добавляя virtual-ism, мы увеличиваем накладные расходы. Вот почему в этот момент программист должен явно делать каждый метод / dtor виртуальным, когда нам требуется полиморфизм.
Теперь возникает вопрос, почему не может стандартная с ++ реализация абстрактного класса по умолчанию для деструктора. Разве вы не думаете, что будет странно иметь другую реализацию, а также это вызовет путаницу. А как насчет случая (каким бы маленьким он ни был), когда вам не нужно, чтобы distructor был virtaul (чтобы сохранить память). объем памяти