ПрограммированиеФорумОбщее

Помогите пожалуйста разобраться с кодом (c++)

#0
17:01, 12 ноя 2017

Всем привет.

Есть вот такой код:

#include <iostream> 
 
class A { 
public:
  ~A() { 
    std::cout << "~A"; 
  }; 
}; 
 
class B: public A {
public:
  virtual ~B() { 
    std::cout << "~B"; 
  }; 
}; 
 
int main(int argc, char** argv) { 
  A *a = new B(); 
  delete a; 
  return 0; 
}

Он компилируется, но при запуске почему-то вылетает ошибка исключения.
И ещё вопрос - в чём смысл во втором классе делать деструктор виртуальным?

#1
17:15, 12 ноя 2017

Никаких ошибок не вылетает (да и не должно):
https://ideone.com/e5ypVh

#2
17:18, 12 ноя 2017

Хм.. А на MSVC у меня вылетает..
Ну да ладно..
А зачем виртуальный деструктор во втором классе делать?

#3
17:26, 12 ноя 2017

DEN 3D
> А зачем виртуальный деструктор во втором классе делать?
сделай в первом : )

#4
22:27, 12 ноя 2017

DEN 3D
> в чём смысл во втором классе делать деструктор виртуальным
он везде должен быть виртуальным, иначе ты не вызовешь деструктор потомка по указателю на предок.

#5
8:38, 13 ноя 2017

DEN 3D
> Есть вот такой код:
Это код из какого-то теста на проверку знаний по C++?

#6
9:31, 13 ноя 2017

sapogi.jpg

#7
9:59, 13 ноя 2017

PANDA

рановато для зимней сессии :)

#8
14:36, 13 ноя 2017

Мизраэль
>
> он везде должен быть виртуальным, иначе ты не вызовешь деструктор потомка по
> указателю на предок.
>
Он должен быть виртуальным в базовом классе (class A)
Если в базовом классе деструктор виртуальный, в дочерних классах спецификатор virtual необязателен, деструктор в любом случае будет виртуальным.

#9
14:40, 13 ноя 2017

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

#10
16:14, 13 ноя 2017

Vitorio
> Может ли подобный код из нуль-поста(когда в базовом классе деструктор не
> виртуальный, а в наследнике(ах) виртуальный) применяться для каких-то целей на практике.
Если от наследников дальше ничего не наследуется, смысла в виртуальности там никакого.
Отсутствие же виртуальности в базовом классе может значить что удалять нельзя через базовый, вот и все. Удалять что создавали или удалять через addref/release можно и без виртуального деструктора. Но надо бы как-нибудь этот факт описывать, опасно оставлять просто так, как этом коде. Кто-нибудь взорвется.

#11
16:27, 13 ноя 2017

Бери шинель, пошли домой.

ПрограммированиеФорумОбщее

Тема в архиве.