Короткий ответ:
Сделайте свой деструктор в Node
виртуальной.
class Node {
// Stuff...
virtual ~Node();
};
Not-So-Краткий ответ:
Когда Projectile
и подобные, которые наследуют Node
, элементы данных и функции, унаследованные от Node
. Производный класс может переопределить или заменить фактическое определение функции в родительском классе. Это переопределение происходит либо во время компиляции, либо во время выполнения, в зависимости от погоды функция в базовом классе объявляется «виртуальной».
В случае не виртуального деструктора деструктор, вызываемый, определяется типом указателя. Поэтому, хотя указательная переменная p
указывает на экземпляр Projectile
, delete(p)
вызовет деструктор, определенный в Node
.
В случае виртуального деструктора деструктор, подлежащий вызову, определяется во время выполнения.Таким образом, независимо от типа указателя деструктор, который вызывается, будет тем, который определен в объекте, указанном в p
.
Возможный дубликат [Когда использовать виртуальные деструкторы?] (Http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors) – LogicStuff
Вы имеете в виду, что 'Projectile' наследует от' Node' (если это так, 'суперкласс' является неправильным термином, чтобы связать« Снаряд »с« Узлом »)? – crashmstr
Деструктор по умолчанию не является виртуальным. Если этого еще нет, включите уровень предупреждения компилятора (-Wall должно быть достаточно для этого в g ++), и вы увидите, что компилятор говорит вам, что написанное вами не будет работать. – user4581301