Если общедоступный деструктор класса является невиртуальным, то класс должен быть объявлен финалом
Если общедоступный деструктор класса является невиртуальным, то класс должен быть объявлен финалом.
На 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® отмечает объявление класса, если оба этих оператора верны:
public
деструктор класса не объявляется как virtual
.
Класс не объявляется final
.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Специальные функции членства |
Категория: консультация, автоматизированная |