Код: Выделить всё
class parent {
public:
parent();
~parent();
virtual void foo(){}
};
class child : public parent {
public:
child();
virtual void foo(){
// Foo implementation
}
};
Нарушает ли добавление виртуального к деструктору в родительском элементе совместимость ABI? Согласно странице политики двоичной совместимости KDE, в которой частично говорится:
Вы можете...
- Добавлять новые невиртуальные функции, включая сигналы, слоты и конструкторы, которые не перегружают неперегруженные функции.
- ...
- Для виртуальных функций-членов:
Добавьте виртуальную функцию в класс, который не имеет виртуальных функций или виртуальных баз. - Добавьте новые виртуальные функции в неконечные классы, поскольку это приведет к поломке подклассов. Обратите внимание, что класс, предназначенный для создания подклассов приложениями, всегда является неконечным классом. Некоторые обходные пути см. ниже или спросите в списках рассылки.
- Добавляйте новые виртуальные функции по любой причине, даже в конечные классы, если класс должен оставаться двоично совместимым в Windows. Это может изменить порядок существующих виртуальных функций и нарушить двоичную совместимость.
- Измените порядок виртуальных функций в объявлении класса.
- Переопределите существующую виртуальную функцию, если эта функция не входит в основной базовый класс (первый невиртуальный базовый класс или основной базовый класс основного базового класса и выше).
- Переопределить существующую виртуальную функцию, если переопределяющая функция имеет ковариантный тип возвращаемого значения, для которого более производный тип имеет адрес указателя, отличный от менее производного (обычно это происходит, когда между менее производным и более производным существует множественное наследование или виртуальное наследование).
- Удалить виртуальную функцию, даже если она является перереализацией виртуальной функции из базовый класс
Вам следует...
- Добавить невстраиваемый виртуальный деструктор, даже если тело пусто.
Подробнее здесь: https://stackoverflow.com/questions/798 ... patibility