メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C++:2008 Rule 5-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. 1

根拠

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

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

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 を呼び出します。

チェック情報

グループ: Expressions
カテゴリ: 推奨

バージョン履歴

R2013b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.