メインコンテンツ

AUTOSAR C++14 Rule A10-3-2

Each overriding virtual function shall be declared with the override or final specifier

説明

ルール定義

オーバーライドするバーチャル関数は、オーバーライド指定子または最終指定子を使用して宣言するものとします。

根拠

バーチャル関数は、クラス階層にポリモーフィックな動作を実装します。基底クラスで関数を virtual として宣言すると、派生クラス内に同じパラメーター リストをもつすべての関数のインスタンスによって基底関数が暗黙的にオーバーライドされます。ポリモーフィックな関数の実装をコンパイラによるこの暗黙的アクションに依存している場合は、エラーにつながる可能性があります。次に例を示します。

  • 関数が誤って virtual になる可能性があります。これは、その署名が基底クラス内のバーチャル関数と一致するためです。

  • 関数が誤って非バーチャルになる可能性があります。これは、パラメーター リストに違いがあるためです。

オーバーライドするバーチャル関数を暗黙的に宣言すると、コードが読みにくくなる可能性もあります。

不注意によるエラーを回避し、可読性を向上させるには、オーバーライドする関数のすべての宣言で指定子の overridefinal を明示的に使用します。

Polyspace 実装

Polyspace® は、次のすべての文に該当する場合に、virtual 関数の宣言にフラグを設定します。

  • 関数が派生クラスに属している。

  • 関数の署名と基底クラス内のバーチャル関数の署名が一致する。

  • 関数の宣言に指定子の override または final が存在しない。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <cstdint>
class Base
{
public:
	virtual ~Base() {}
	virtual void F() noexcept = 0;
	virtual void G() noexcept {}
	virtual void Z() noexcept {}
	virtual Base& operator+=(Base const& oth) = 0;
};
class Derived1 : public Base
{
public:
	~Derived1() override {}                         //Compliant
	void F() noexcept{}                             //Noncompliant
	virtual void G() noexcept {}                    //Noncompliant
	void Z() noexcept override {}                   // Compliant
	Derived1& operator+=(Base const& oth) override  // Compliant
	{
		return *this;
	}
};
class Derived2 : public Base
{
public:
	~Derived2() {}                                  //  Noncompliant
	void F() noexcept override {}                   //  Compliant
	void G() noexcept override {}                   //  Compliant
	void Z() noexcept override {}                   //  Compliant
	Derived2& operator+=(Base const& oth)           //  Noncompliant
	{                                               
		return *this;                          
	}                                             
};                                                  
class Derived3 : public Base                        
{                                                   
	void F() noexcept override;                     // Compliant 
};

main(){
	
}

  • 関数 Derived::F() の宣言は、その署名が Base::F() の署名と一致し、その宣言に override または final が含まれていないため、フラグが設定されます。

  • 関数 Derived::G() の宣言は、その署名が Base::G() の署名と一致し、その宣言に override または final が含まれていないため、その宣言で指定子 virtual が使用されていても、フラグが設定されます。

  • クラス Derived3 内の関数 Derived3::F() の宣言では指定子 override が使用されるため、フラグは設定されません。

チェック情報

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

バージョン履歴

R2020a で導入