メインコンテンツ

AUTOSAR C++14 Rule M5-2-3

Casts from a base class to a derived class should not be performed on polymorphic types.

説明

ルール定義

Casts from a base class to a derived class should not be performed on polymorphic types.

根拠

ポリモーフィック基底クラスを派生クラスに明示的にキャストすると、実装階層内の抽象化のレイヤーがバイパスされ、クラス間の結合と依存関係が増加します。

ポリモーフィック クラスを使用する場合は、明示的なダウンキャストの実行を避けてください。ポリモーフィック基底クラスへのポインターでは、派生クラスへのポインターに対する明示的なキャストは必要ありません。

Polyspace 実装

Polyspace® は、基底クラスが派生クラスにキャストされた場合に違反を報告します。

トラブルシューティング

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

すべて展開する

class Base{ //Abstract base class
	//...
public:
	virtual bool getStatus() const = 0;
};
class Derived: public Base{
	//...
public:
	virtual bool getStatus() const{ //Implementation of getStatus()
		//...
	}
};
void printStatus(const Base& B){
	const Derived* D = dynamic_cast<const Derived*>(&B);//Noncompliant
	D->getStatus();
}
void printStatus_compliant(const Base& B){
	B.getStatus();//Compliant
}

この例では、Base クラス ポインター BprintStatus 内の Derived クラス ポインターにキャストされます。このキャストは非準拠のため、Polyspace は違反を報告します。関数 getStatus_compliant() はこの機能の準拠実装を示します。ここでは、関数 virtualBase クラスへのポインターを介してクラス メンバー関数 Derived を呼び出します。

チェック情報

グループ:
カテゴリ: Advisory、Automated

バージョン履歴

R2019a で導入