AUTOSAR C++14 Rule A10-4-1

Иерархии должны быть основаны на интерфейсных классах

Описание

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

Иерархии должны быть основаны на интерфейсных классах.

Объяснение

Интерфейсный класс имеет эти свойства:

  • Если класс имеет функции членства, они - общедоступный и чистый virtual.

  • Если класс имеет элементы данных, они общедоступны и static constexpr.

Используя интерфейсный класс как базовый класс в иерархии:

  • Разделяет интерфейс и реализацию. Код базового класса более устойчив и легче обеспечить.

  • Избегает ненужных расчетов нестатических элементов данных в производных классах и других зависимостях от компиляции.

  • Делает ваше программное обеспечение легче расширить и включает использование альтернативных реализаций через тот же интерфейс.

Реализация Polyspace

Polyspace® отмечает основу иерархии классов, если тот базовый класс не является интерфейсом.

Когда определения классов вкладываются в других классах, средство проверки следует этим соглашениям:

  • Неинтерфейсные базовые классы отмечаются, даже если иерархия вкладывается в другом классе. Например, в этом фрагменте кода, класс NestedBase отмечается:

    class ClassWithNestedHierarchy
    {
        class NestedBase //Non-compliant, not an interface
        {
        public:
            int i;
        };
    
        class NestedDerived : public NestedBase
        {
        public:
            int j;
        };
    };

  • Базовые классы с вложенными неинтерфейсными классами не отмечаются. Например, в этом фрагменте кода, NestedClass не интерфейсный класс, но внешний класс InterfaceWithInnerClass не отмечается, когда используется в качестве базового класса:

    class InterfaceWithInnerClass
    {
    public:
        class NestedClass   //not an interface class
        {
        private:
            int i;
        };
    
        static constexpr NestedClass i{};
    };
    
    class DerivedBaseWithInnerClass : public InterfaceWithInnerClass
    {
    private:
        int i;
    };

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

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

Примеры

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

class Interface
{
public:
    virtual ~Interface() = 0;
    virtual void SomeFunc() = 0;
};

class NotAnInterface //Non-compliant
{
public:
    void Implementation() {}

};

class IsDerived1 : public Interface
{

public:
    ~IsDerived1() {}

    void SomeFunc() final {}

};


class IsDerived2 : public NotAnInterface
{
public:
    IsDerived2() = default;
};


template <typename T>
class TmplInterface
{
public:
    virtual T func() noexcept = 0;

};
template<typename T>
class TmplNotInterface //Non-compliant
{
public:
    T func2();
};

template <typename T>
class TmplDerived: public TmplInterface<T>, TmplNotInterface<T>
{
public:
    T func() noexcept override { return t;}

    T t;
};

class TmplDerived<int> var;

В этом примере, флагах средства проверки:

  • Неинтерфейсный класс NotAnInterface, который действует как основа для класса IsDerived2. Класс NotAnInterface не интерфейсный класс, потому что он содержит невиртуальную функцию членства.

  • Класс неинтерфейса шаблона TmplNotInterface, который действует как основа для класса TmplDerived. Обратите внимание на то, что TmplDerived также выводит из интерфейсного класса TmplInterface, который совместим с правилом.

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

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