AUTOSAR C++14 Rule A10-2-1

Невиртуальные общедоступные или защищенные функции членства не должны быть переопределены в производных классах

Описание

Управляйте определением

Невиртуальные общедоступные или защищенные функции членства не должны быть переопределены в производных классах.

Объяснение

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

Переопределения функций от частного наследования или функций, которые являются частными в базовом классе, не затронуты этим правилом.

Реализация Polyspace

Polyspace® переопределения флагов невиртуальных функций членства в производном классе. Polyspace не повышает этот дефект на деструкторах.

Чтобы выровнять по ширине переопределение, которое вы считаете как приемлемые, используйте аннотации. Смотрите Аннотируют Код и Скрывают Известные или Приемлемые результаты

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

развернуть все

class A
{
  public:
    virtual ~A() = default;
    void F() noexcept {}
    virtual void G() noexcept {}  
  private:    
    void H() noexcept
};

class B : public A 
{
  public:    
    void F() noexcept {} //Noncompliant    
    void G() noexcept override {} //Compliant 
};

В этом примере, A::F()функция является невиртуальной общедоступной функцией членства, которая скрыта классом B. Сокрытие A::F() предотвращает использование полиморфных интерфейсов, таким образом, Polyspace отмечает переопределение в B::F() как несовместимый. A::G() функция является виртуальной и заменена (а не скрытой) в B::G(), таким образом, Polyspace не отмечает эту реализацию как несовместимую.

Проверяйте информацию

Группа: производные классы
Категория: необходимый, автоматизированный
Введенный в R2019a