Чистая виртуальная функция, перекрывающая виртуальную функцию

Предположим, приведен следующий код.

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;
   }
};
Другие вопросы по тегам