MISRA C++:2008 Rule 12-1-2
All constructors of a class should explicitly call a constructor for all of its immediate base classes and all virtual base classes.
説明
ルール定義
All constructors of a class should explicitly call a constructor for all of its immediate base classes and all virtual base classes. 1
根拠
基底クラスのコンストラクターのすべてを明示的に呼び出すわけではない派生クラスでは、オブジェクト構築の際にどの基底クラスのコンストラクターが使用されるかに関してあいまいさが生じます。
次のダイヤモンド クラス階層を考えてください。
SuperClass
/ \
ClassA ClassB
\ /
ClassC ClassC オブジェクトを構築するときに、ClassA または ClassB のどちらが SuperClass を初期化するのかが明白ではありません。意図していない初期値で SuperClass が構築されると、予期しないコードの動作になるリスクが高くなります。ClassC を使用して SuperClass の初期化に使用するコンストラクターを明示的に指定すると、このダイヤモンド階層のあいまいさが解決されます。
無効な状態または意図しない初期値を回避するには、派生クラス コンストラクターの初期化リスト内で必要な基底クラス コンストラクターを直接呼び出します。
Polyspace 実装
Polyspace® は、派生クラス コンストラクターの初期化リストが次のようになっている場合、コンストラクターにフラグを設定します。
バーチャル基底クラスのコンストラクターを明示的に呼び出していない。
直接非バーチャル基底クラスのコンストラクターを明示的に呼び出していない。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: Special Member Functions |
| カテゴリ: 推奨 |
バージョン履歴
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.