メインコンテンツ

AUTOSAR C++14 Rule A10-3-3

Virtual functions shall not be introduced in a final class

説明

ルール定義

バーチャル関数は最終クラスで導入しないものとします。

根拠

virtual としての関数の宣言は、派生クラス内の関数を別の実装でオーバーライドすることを示します。これにより、1 つの関数で階層内の異なる複数のクラスと個別にやり取りすることができます。クラスを final として明示的に指定した場合は、そこからクラスを派生させることができません。final クラスからクラスを派生できないため、final クラスでバーチャル関数を導入しないでください。final クラス内のすべてのバーチャル関数は、指定子 final を使用して指定します。

Polyspace 実装

Polyspace® は、final クラス内のバーチャル関数の宣言にフラグを設定します。Polyspace は、指定子 override final または virtual final を使用する最終クラス内のバーチャル関数にフラグを設定しません。

トラブルシューティング

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

すべて展開する

#include <cstdint>
class Base
{
public:
	virtual ~Base() = default;
	virtual void F() noexcept = 0;
	virtual void G() noexcept {/*...*/}
	virtual void Y() 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
	void Y() noexcept override final{/*...*/}    //Compliant
};

関数の Derived::G()Derived::Z()、および Derived::H() は、final として指定されていない virtual 関数です。これらの宣言は、派生クラス内の一部の関数がこれらの関数をオーバーライドする可能性があることを示します。クラス Derivedfinal として指定されます。つまり、このクラスからの派生クラスは存在しません。Derived::G()Derived::Z()、および Derived::H() の宣言は、それらのクラス Derived の宣言と一貫性がありません。Polyspace は、これらの関数の宣言にフラグを設定します。関数 Derived::F() および Derived::Y()final として宣言されます。これらの宣言はこのルールに準拠しています。

チェック情報

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

バージョン履歴

R2020a で導入

すべて展開する