Иерархии должны быть основаны на интерфейсных классах
Иерархии должны быть основаны на интерфейсных классах.
Интерфейсный класс имеет эти свойства:
Если класс имеет функции членства, они - общедоступный и чистый virtual
.
Если класс имеет элементы данных, они общедоступны и static constexpr
.
Используя интерфейсный класс как базовый класс в иерархии:
Разделяет интерфейс и реализацию. Код базового класса более устойчив и легче обеспечить.
Избегает ненужных расчетов нестатических элементов данных в производных классах и других зависимостях от компиляции.
Делает ваше программное обеспечение легче расширить и включает использование альтернативных реализаций через тот же интерфейс.
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; };
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.
Группа: производные классы |
Категория: консультация, неавтоматизированная |