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