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