exponenta event banner

Правило AUTOSAR C++ 14 A10-3-3

Виртуальные функции не должны вводиться в окончательный класс

Описание

Определение правила

Виртуальные функции не должны вводиться в окончательный класс.

Объяснение

Объявление функции как virtual указывает на необходимость переопределения функции в производном классе с другой реализацией. Затем одна и та же функция может по-разному взаимодействовать с различными классами иерархии. При явном указании класса как final, из него нельзя получить класс. Потому что нельзя вывести классы из final класс, не вводить виртуальные функции в final класс. Укажите все виртуальные функции в final класс с помощью спецификатора final.

Внедрение Polyspace

Polyspace ® помечает объявление виртуальных функций в final класс, объявленный с этими спецификаторами:

  • virtual

  • override

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#include <cstdint>
class Base
{
public:
	virtual ~Base() = default;
	virtual void F() noexcept = 0;
	virtual void G() noexcept {/*...*/}
};
class Derived final : public Base
{
public:

	void G() noexcept override{/*...*/} //Noncompliant
	virtual void Z() noexcept{/*...*/}  //Noncompliant
	virtual void H() noexcept = 0;    //Noncompliant
	void F() noexcept final{/*...*/}    //Compliant
};

main(){
	
}

Функции Derived::G(), Derived::Z(), и Derived::H() являются virtual функции, которые не указаны как final. Их объявления указывают, что некоторые функции в производном классе могут переопределять эти функции. Класс Derived указывается как final. То есть производные классы от этого класса отсутствуют. Заявления Derived::G(), Derived::Z(), и Derived::H() несовместимы с объявлением их класса Derived. Polyspace помечает объявления функций. Функция Derived::F() объявлен как final. Это объявление соответствует этому правилу.

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

Группа: Производные классы
Категория: Обязательно, Автоматизировано
Представлен в R2020a