AUTOSAR C++14 Rule 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