Деструктор базового класса должен быть общедоступным виртуальным, общедоступным переопределением или защищенный невиртуальный.
Деструктор базового класса должен быть общедоступным виртуальным, общедоступным переопределением или защищенный невиртуальный.
Если деструктор базового класса не является общедоступным виртуальным или общедоступным переопределением, класс не может вести себя полиморфно для удаления объектов производного класса.
Если указатель на базовый класс относится к объекту производного класса, и вы используете указатель, чтобы удалить объект:
class Base { public: ~Base() {} }; class Derived: public Base { public: ~Derived() {} }; ... void func(Base* ptr) { //ptr might point to a Base or Derived object delete ptr; }
Если вы хотите предотвратить вызов деструктора производного класса через указатель базового класса, сделайте свое намерение явным путем создания деструктора защищенным. В противном случае может казаться, что возможность полиморфного удаления объектов производного класса не была рассмотрена.
Средство проверки отмечает базовые классы с помощью деструкторов, которые не являются общедоступным виртуальным, общедоступным переопределением или защищенный невиртуальный.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Специальные функции членства |
Категория: необходимый, автоматизированный |