MISRA C++:2008 Rule 10-3-3

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

Описание

Управляйте определением

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

Объяснение

На C++ абстрактный класс является основой полиморфной иерархии классов, и производные классы реализуют изменение абстрактного класса. Когда виртуальная функция заменена в производном классе чистой виртуальной функцией, производный класс становится абстрактным классом. То, что производный класс задан как абстрактный класс, или реализованная функция заменена чистой виртуальной функцией, является неожиданным поведением, которое может смутить разработчика.

Реализация Polyspace

Polyspace® отмечает чистую виртуальную функцию, если она заменяет функцию, которая не является чиста виртуальный.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

class Conic{
	//...
	public:
	double centerAbscissa;
	double centerOrdinate;
	//..
	virtual double  getArea()=0;
};
class Circle: public Conic{
	//...
	public:
	//...
	double getArea() override{
		//calculate area of circle
	}
};
class Ellipse: public Circle{
	//...
	public:
	//...
	virtual double getArea()=0; //Noncompliant
};

В этом примере, базовый класс Conic абстрактный класс потому что функциональный getArea() чистая виртуальная функция. Производный класс Circle реализует функциональный getArea. Ожидание от такой полиморфной иерархии состоит в том что виртуальная функция getArea вычисляет область правильно на основе производного класса. Когда производный класс Ellipse повторно объявляет getArea как чистая виртуальная функция, производный класс Ellipse становится абстрактным и функциональный Ellipse.getArea() не может быть вызван. Разработчики могут ожидать Ellipse.getArea() возвратить область эллипса. Поскольку этот redeclaration как чистая виртуальная функция не оправдывает надежду разработчика, Polyspace отмечает объявление.

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

Группа: производные классы
Категория: необходимый
Введенный в R2013b