メインコンテンツ

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

MISRA C++:2008 Rule 10-1-1

Classes should not be derived from virtual bases.

説明

ルール定義

Classes should not be derived from virtual bases. 1

根拠

バーチャル基底クラスの使用は多くの紛らわしい動作につながる可能性があります。

たとえば、バーチャル基底クラスを含む継承階層では、最上位の派生クラスでバーチャル基底クラスのコンストラクターが呼び出されます。そのバーチャル基底コンストラクターの中間呼び出しは無視されます。

Polyspace 実装

Polyspace® は、クラスが virtual 基底クラスから派生している場合に違反を報告します。

トラブルシューティング

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

すべて展開する

class Base {};
class Intermediate: public virtual Base {}; //Noncompliant
class Final: public Intermediate {};

この例では、ルール チェッカーは、Intermediate クラスが virtual キーワードを使用した Base クラスから派生するときに違反を報告しています。

次の動作は混乱の原因になる可能性があります。Final 型のオブジェクトを作成するとき、Final のコンストラクターは Base のコンストラクターを直接呼び出します。Intermediate のコンストラクターからの Base のコンストラクターの呼び出しは無視されます。この動作を考慮に入れていない場合、予期しない結果になる可能性があります。

チェック情報

グループ: Derived Classes
カテゴリ: 推奨

バージョン履歴

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.