(Правило 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
}

Проблема многих инструментов, пытающихся обнаружить подозрительные выражения, если они созданы простыми людьми, а не богами. Таким образом, они могут иногда не обнаруживать проблему (необнаружение) или хрипеть о легальной (ложное срабатывание). Кроме того, ложное срабатывание часто рассматривается как менее серьезное, потому что программисту нужно просто проверить свой код и игнорировать его. Если вы можете убедиться, что предупреждение является просто ложным срабатыванием, вы часто можете использовать специальный комментарий, чтобы сообщить инструменту, что одно конкретное правило должно быть проигнорировано в этом специальном месте, чтобы избавиться от предупреждения. Просто убедитесь, что игнорируете как можно меньше...

Другие вопросы по тегам