(Правило Cppdepend) «Конструктор не должен вызывать виртуальные методы» работает только с собственным (базовым) классом?
У меня вопрос к "Конструктор не должен вызывать виртуальные методы" (в C++). Да я знаю проблему. Проблема ясна. Это описано, например , здесь
У меня есть специальный вопрос. Я начинаю с CppDepent, проверяю мой проект. Теперь CppDepent предупреждает меня каждый раз, когда я вызываю виртуальную функцию в конструкторе. Независимо от того, находится ли функция в базовом классе или нет. Он предупреждает, если это виртуальная функция другого класса. (см. образец)
Вопрос: Является ли проблемой вызов виртуальной функции в конструкторе (тот же деструктор) класса, который не является базовым классом.
class NotABaseClass {
explicit NotABaseClass(){}
virtual void foo_virtual(){};
}
class NotADeriveClass {
explicit NotADeriveClass(){
NotABaseClass notABaseClass;
notABaseClass.foo_virtual();
}
}
1 ответ
Правило C++ гласит, что вы не должны вызывать виртуальный метод для объекта до этого объекта, если он полностью сконструирован.
В вашем примере виртуальный метод называется так:
explicit NotADeriveClass(){ // we are in a ctor: *this is not fully constructed
NotABaseClass notABaseClass; // let us create a local NotABaseClass object
notABaseClass.foo_virtual(); // legal on a fully constructed object
}
Проблема многих инструментов, пытающихся обнаружить подозрительные выражения, если они созданы простыми людьми, а не богами. Таким образом, они могут иногда не обнаруживать проблему (необнаружение) или хрипеть о легальной (ложное срабатывание). Кроме того, ложное срабатывание часто рассматривается как менее серьезное, потому что программисту нужно просто проверить свой код и игнорировать его. Если вы можете убедиться, что предупреждение является просто ложным срабатыванием, вы часто можете использовать специальный комментарий, чтобы сообщить инструменту, что одно конкретное правило должно быть проигнорировано в этом специальном месте, чтобы избавиться от предупреждения. Просто убедитесь, что игнорируете как можно меньше...