AUTOSAR C++14 Rule A12-1-6

Производные классы, которые не нуждаются в дальнейшей явной инициализации и требуют всех конструкторов от базового класса, должны использовать наследовавшихся конструкторов

Описание

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

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

Объяснение

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

В таких ситуациях использование наследовавшихся конструкторов в производном классе решает эти проблемы.

Реализация Polyspace

Polyspace отмечает класс для нарушения этого правила, если класс удовлетворяет всем этим условиям:

  • Класс выводит из одного базового класса.

  • Класс использует всех конструкторов базового класса и повторно реализует их в определении класса.

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

#include <cstdint>

class A               
{
  public:
    A(std::int32_t x, std::int32_t y) : x(x + 8), y(y) {}
    explicit A(std::int32_t x) : A(x, 0) {}

  private:
    std::int32_t x;
    std::int32_t y;
};

class B : public A    // Non-compliant
{
  public:
    B(std::int32_t x, std::int32_t y) : A(x, y) {}
    explicit B(std::int32_t x) : A(x) {}
};

class C : public A   // Compliant
{
  public:
    using A::A;
};

Переопределение B(std::int32_t x, std::int32_t y) и explicit B(std::int32_t x) нарушает правило, потому что они идентичны конструкторам базового класса A(std::int32_t x, std::int32_t y) и explicit A(std::int32_t x).

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

Группа: Специальные функции членства
Категория: необходимый, автоматизированный
Введенный в R2020b