Если публичный деструктор класса не является виртуальным, то класс должен быть объявлен окончательным
Если публичный деструктор класса не является виртуальным, то класс должен быть объявлен окончательным.
В C++, когда любой объект производного класса уничтожается, сначала вызывается деструктор его класса, а затем вызываются деструкторы базовых классов. Иерархии классов также могут быть полиморфными. Можно объявить указатель базового класса и назначить ему производный объект класса. Чтобы безопасно уничтожить объекты, принадлежащие иерархии классов, объявите public
классифицирует деструкторы как virtual
. Рассмотрим этот код, где уничтожаются два указателя базовых классов, которые указывают на производные объекты.
class Base{ public: virtual ~Base(); //.. }; class Derived : public Base{ public: ~Derived(); //.. }; class Base2{ public: ~Base2(); //.. }; class Derived2 : public Base2{ public: ~Derived2(); //... }; int main(){ Base* ptr = new Derived; Base2* ptr2 = new Derived2; delete ptr; delete ptr2; }
Объект ptr
- указатель на класс Base
который указывает на объект класса Derived
. Когда ptr
удаляется, сначала вызывается деструктор производного класса, а затем вызывается деструктор базового класса. Хотя ptr
является объектом базового класса, правильные деструкторы вызываются, чтобы освободить все полученные ресурсы, потому что public
деструкторы в этой иерархии классов объявляются как virtual
.
Когда указатель ptr2
удален, деструктор вызывается только для базового класса, поскольку public
деструкторы в этой иерархии классов являются невиртуальными. Такого рода неполное уничтожение является неопределенным поведением, которое может привести к утечкам памяти и неожиданному прекращению выполнения кода.
Чтобы предотвратить неопределенное поведение, не используйте классы с public
невиртуальные деструкторы как базовые классы. Объявить такие классы как final
чтобы указать, что эти классы не являются базовыми классами и новые классы не могут быть выведены из них.
Polyspace® помечает объявление класса, если оба этих операторов являются true:
The public
деструктор класса не объявляется как virtual
.
Класс не объявлен final
.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Специальные функции представителей |
Категория: Консультационные, Автоматизированные |