Чистая виртуальная функция, перекрывающая виртуальную функцию
Предположим, приведен следующий код.
class A
{
public:
virtual void someMethod()
{
std::cout << "class A" << std::endl;
}
};
class B : public A
{
public:
...
virtual void someMethod() = 0;
...
};
Учебный класс B
Переопределение someMethod
виртуальный метод с чисто виртуальным методом. Целью этого может быть расширение существующего класса, который не разрешено изменять в нашем случае класса A
, но все еще с абстрактным классом B
который должен быть базовым классом для некоторых других классов.
Согласно правилу 10-3-3 MISRA-C++: Анализатор кода выдает предупреждение: чисто виртуальная функция переопределяет не чисто виртуальную функцию.
Но я не могу найти много деталей о предупреждении. Каков побочный эффект вышеупомянутого кода? Что здесь плохого?
ОБНОВЛЕНИЕ: стандарт MISRA-C++ (C++98)
3 ответа
Я не вижу здесь никакой тайны. Анализатор кода, скорее всего, проверяет ваш код на соответствие стандарту MISRA, а не стандарту C++ 98.
MISRA - это набор стандартов кодирования C/C++ для автомобильной среды, который накладывает дополнительные ограничения на то, что предположительно законно / разрешено языковым стандартом.
Вы переопределяете с чистой виртуальной функцией не чисто виртуальную функцию, и, очевидно, это нормально для компилятора, но не для правил MISRA.
То есть ваша программа будет хорошо скомпилироваться и выполняться и будет соответствовать языковому стандарту, но она может не быть принята заказчиком, который требует проверки кода и соответствия стандарту MISRA.
Я бы сказал, что ваш код действителен в соответствии со стандартом:
§ 10.4
5 [Примечание: абстрактный класс может быть получен из класса, который не является абстрактным, и чисто виртуальная функция может переопределять виртуальную функцию, которая не является чистой. —Конечная записка]
Наследование обратное.
Он имеет класс A, унаследованный классом B. B имеет чисто виртуальную функцию. Я считаю, что вам нужен следующий код. В нем говорится, что дочерние классы B должны реализовать somemethod().
class B
{
public:
...
virtual void someMethod() = 0;
...
};
class A : public B
{
public:
virtual void someMethod()
{
std::cout << "class A" << std::endl;
}
};