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