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