У меня есть три класса.
class Son : public Father;
class Father : public Grandfather;
Father
абстрактно и так Grandfather
, Son
НЕ абстрактно.
Если я сделаю это:
Son* son = new Son();
и затем сделайте это:
delete(son)
как мне убедиться, что деструкторы Father
а также Grandfather
называются?
Деструкторы родительских классов к вашему указателю будут вызываться несмотря ни на что.
Вы должны сделать деструктор класса верхнего уровня virtual
тем не менее, так что вы можете удалить указатель на Grandfather
и убедитесь, что все деструкторы подкласса также вызваны. Невыполнение этого требования ведет к неопределенному поведению, что всегда плохо.
Когда функция virtual
, он будет виртуальным для всего дерева деривации, нет необходимости отмечать его в дочерних классах. Однако обычно это хорошая форма, это помогает людям читать код.
Других решений пока нет …