Это неправильно
struct base{
virtual ~base() =0;
};
потому что base::~base
не определено. Несмотря на то, что он был объявлен как чисто виртуальный, его необходимо определить (вне класса, нет синтаксического способа объявить функцию как чисто виртуальную и определить ее как встроенную), поэтому derived
может наследовать от нее:
struct base
{
virtual ~base() = 0;
};
base::~base() {}
Я хотел бы знать, почему я не могу определить виртуальные деструкторы вне определения класса
Ну, вы можете: я только что сделал.
Тогда зачем вам нужно реализовывать функцию (~base
), которая была объявлена чисто виртуальной?
Поскольку derived
наследуется от base
, когда объект типа derived
разрушается, он обязательно вызывает деструктор base
. Вот как работает наследование. В некотором смысле, derived::~derived
необходимо связать с base::~base
. Хотя base::~base
является чисто виртуальным (то есть класс, наследующий от base
, не является полным типом, если он не определяет деструктор), ему необходимо определить , чтобы ~derived
нашел его и компоновщик стал счастливый.