Динамический тип объекта не должен использоваться от тела его конструктора или деструктора
Динамический тип объекта не должен использоваться от тела его конструктора или деструктора.
Динамический тип объекта является типом своей большей части производного класса. Например:
struct B { virtual ~B() {} }; struct D: B {}; D d; B* ptr = &d;
*ptr
D
потому что это - большая часть производного класса в полиморфной иерархии.Когда вы вызываете динамический тип полиморфного объекта в его конструкторе или деструкторе, вы можете получить тип созданного или уничтоженного объекта вместо типа большей части производного объекта. Это вызвано тем, что, когда вы вызываете динамический тип во время конструкции или деструктора, производные классы еще не могут быть созданы. Используя динамические типы в конструкторах и деструкторах может привести к неожиданному поведению. Вызывание чистых виртуальных функций от конструкторов и деструкторов приводит к неопределенному поведению. Избегайте использования динамического типа объекта в его конструкторах или деструкторах.
Polyspace® флаги эти элементы, когда они используются в конструкторе или деструкторе полиморфного класса:
Оператор typeid
Виртуальные или чистые виртуальные функции
Функциональный dynamic_cast
или неявные броски C-стиля
Polyspace принимает, что класс является полиморфным, если это имеет какой-либо виртуальный член.
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.
Группа: специальные функции членства |
Категория: необходимый |