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

Может ли деструктор по умолчанию быть создан как виртуальный деструктор автоматически?

Может ли деструктор по умолчанию быть создан как виртуальный деструктор автоматически?

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

4b9b3361

Ответ 1

Нет. Существует стоимость, связанная с созданием метода виртуальным, а на С++ есть философия не заставлять вас платить за вещи, которые вы явно не заявляете, что хотите использовать. Если бы виртуальный деструктор был создан автоматически, вы бы заплатили цену автоматически.

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

Ответ 2

В С++ 11 вы можете использовать:

class MyClass
{
  // create a virtual, default destructor
  virtual ~MyClass() = default;
};

Ответ 3

Нет, все деструкторы по умолчанию НЕ являются виртуальными.

Вам нужно будет определить виртуальный деструктор во всех базовых классах

В дополнение к этому.

Процитировать Скотта Мейерса в его книге "Эффективный С++":

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

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

Я предлагаю, только сделайте его не виртуальным, когда вы абсолютно уверены, что хотите этого, а не полагаетесь на не-виртуальную по умолчанию, которую выполняют компиляторы. Однако вы можете не согласиться (в заключение), что у меня недавно была ужасная утечка памяти в каком-то унаследованном коде, где все, что я делал, добавляло std::vector в один из классов, существовавших несколько лет. Оказывается, что у одного из его базовых классов не было деструктора, определенного (деструктор по умолчанию пуст, не виртуальный!), И поскольку память не выделялась так, как до того, как память не просочилась до этой точки. Много дней расследования и времени были потрачены впустую позже...

Ответ 4

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

Ответ 5

Ури и Майкл правы - я просто добавлю, что если при прослушивании вам нужно прикоснуться к двум файлам, чтобы объявить и определить деструктор, то совершенно правильно определить минимальный встроенный в заголовок:

class MyClass
{
   // define basic destructor right here
   virtual ~MyClass(){}

   // but these functions can be defined in a different file
   void FuncA();
   int FuncB(int etc);
}

Ответ 6

В настоящее время правильный Uri. С другой стороны, после того, как вы объявили виртуальный метод в своем классе, вы все равно платите за существование виртуальной таблицы. Фактически, компилятор предупредит вас, если ваш класс имеет виртуальный метод, но не виртуальный деструктор. Это может стать кандидатом на автоматическое создание виртуального деструктора по умолчанию, а не надоедливым предупреждением.

Ответ 7

Нет. Вы должны объявить его виртуальным.