メインコンテンツ

AUTOSAR C++14 Rule M10-3-3

A virtual function shall only be overridden by a pure virtual function if it is itself declared as pure virtual.

説明

ルール定義

A virtual function shall only be overridden by a pure virtual function if it is itself declared as pure virtual.

根拠

C++ では、抽象クラスはポリモーフィック クラス階層の基底クラスであり、派生クラスは抽象クラスが変化したものを実装します。派生クラス内で、バーチャル関数が純粋なバーチャル関数によってオーバーライドされると、その派生クラスは抽象クラスになります。派生クラスが抽象クラスとして定義されたり、実装される関数が純粋なバーチャル関数によってオーバーライドされたりするのは予期せぬ動作であり、開発者を混乱させる可能性があります。

Polyspace 実装

純粋なバーチャル関数が純粋でないバーチャル関数をオーバーライドする場合、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
};

この例では、関数 getArea() は純粋なバーチャル関数であるため、基底クラス Conic は派生クラスです。派生クラス Circle は関数 getArea を実装します。このようなポリモーフィック階層では、バーチャル関数 getArea が派生クラスに基づいて正しく面積を計算すると想定されます。派生クラス EllipsegetArea を純粋なバーチャル関数として再宣言すると、派生クラス Ellipse が抽象クラスになり、関数 Ellipse.getArea() を呼び出せなくなります。開発者は、Ellipse.getArea() からは楕円の面積が返されると想定します。純粋なバーチャル関数としてのこの再宣言は開発者が想定するものではないため、Polyspace はこの宣言にフラグを設定します。

チェック情報

グループ: 派生クラス
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入