exponenta event banner

Правило AUTOSAR C++ 14 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