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