В C++ мы можем отлично объявить функцию в файле заголовка, не выполнив ее. Это компилируется отлично, и обычно это не создает никаких проблем, однако ... Мне интересно, может ли это вызвать проблему, когда виртуальный деструктор не реализован.Что происходит, когда виртуальные деструкторы объявлены, но не имеют реализации?
Когда виртуальный деструктор не реализован и когда в этом случае мы удалим экземпляр производного класса с помощью указателя базового класса, будет ли вызываться деструктор производного класса?
E.g.
class Base{
public:
virtual ~Base() {}
};
class Derived: public Base {
public:
~Derived(); // HAS NO IMPLEMENTATION
};
Base *b = new Derived();
delete b;
Примечание: Как было отмечено в комментарии, приведенный выше пример не связывает ПРАВИЛЬНО. Здесь приводится объяснение ситуации, в которой я пытаюсь получить больше информации, однако на практике во время процесса связывания этот пример приведет к ошибке undefined reference to Derived
.
_In C++ мы можем отлично объявить функцию в файле заголовка, не выполняя ее. Это компилируется отлично, и обычно это не создает никаких проблем. Только если вы его не назовете. В противном случае вы получите ошибку компоновщика. Как и в вашем примере. –
Этот комментарий, вероятно, просто пересек обновление, которое я сделал для кода, обратите внимание, что я изменил деструктор базы, которая будет реализована, и деструктор Derived не будет реализован. – Gio
Вы на самом деле ** попробовали ** свой код? Вы должны получить ошибку компоновщика, например 'undefined reference to' Derived :: ~ Derived() ''. –