Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Помогите пожалуйста разобраться с кодом (c++)

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

Поделиться
DEN 3DПостоялецwww12 ноя. 201717:01#0
Всем привет.

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

#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; 
}

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

ArchiDevilПостоялецwww12 ноя. 201717:15#1
Никаких ошибок не вылетает (да и не должно):
https://ideone.com/e5ypVh
DEN 3DПостоялецwww12 ноя. 201717:18#2
Хм.. А на MSVC у меня вылетает..
Ну да ладно..
А зачем виртуальный деструктор во втором классе делать?
Sh.Tac.Постоялецwww12 ноя. 201717:26#3
DEN 3D
> А зачем виртуальный деструктор во втором классе делать?
сделай в первом : )
МизраэльПостоялецwww12 ноя. 201722:27#4
DEN 3D
> в чём смысл во втором классе делать деструктор виртуальным
он везде должен быть виртуальным, иначе ты не вызовешь деструктор потомка по указателю на предок.
VitorioПостоялецwww13 ноя. 20178:38#5
DEN 3D
> Есть вот такой код:
Это код из какого-то теста на проверку знаний по C++?
PANDAПостоялецwww13 ноя. 20179:31#6
sapogi.jpg
innuendoПостоялецwww13 ноя. 20179:59#7
PANDA

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

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

Правка: 13 ноя. 2017 14:36

VitorioПостоялецwww13 ноя. 201714:40#9
Стало любопытно. Может ли подобный код из нуль-поста(когда в базовом классе деструктор не виртуальный, а в наследнике(ах) виртуальный) применяться для каких-то целей на практике. Известно ли что-нибудь по данному вопросу?
ZabПостоялецwww13 ноя. 201716:14#10
Vitorio
> Может ли подобный код из нуль-поста(когда в базовом классе деструктор не
> виртуальный, а в наследнике(ах) виртуальный) применяться для каких-то целей на практике.
Если от наследников дальше ничего не наследуется, смысла в виртуальности там никакого.
Отсутствие же виртуальности в базовом классе может значить что удалять нельзя через базовый, вот и все. Удалять что создавали или удалять через addref/release можно и без виртуального деструктора. Но надо бы как-нибудь этот факт описывать, опасно оставлять просто так, как этом коде. Кто-нибудь взорвется.
nesПостоялецwww13 ноя. 201716:27#11
Бери шинель, пошли домой.

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

2001—2017 © GameDev.ru — Разработка игр