メインコンテンツ

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

A base class shall only be declared virtual if it is used in a diamond hierarchy.

説明

ルール定義

A base class shall only be declared virtual if it is used in a diamond hierarchy. 1

根拠

このルールは、MISRA C++:2008 Rule 10-1-1 ほど制約が厳しくありません。ルール 10-1-1 では、バーチャル基底クラスは混乱を招きかねない動作を引き起こす可能性があるため、コード内のどの場所でもバーチャル基底クラスの使用を禁止しています。

ルール 10-1-2 では、バーチャル基底クラスが役立つ 1 つの状況ではその使用を許容しています。すなわち、ダイヤモンド階層において共通の基底クラスとして使用することです。

たとえば、次のダイヤモンド階層はルール 10-1-1 には違反しますが、ルール 10-1-2 には違反しません。

class Base {};
class Intermediate1: public virtual Base {};
class Intermediate2: public virtual Base {};
class Final: public Intermediate1, public Intermediate2 {};

Polyspace 実装

Polyspace® は、単一の線形階層でバーチャル基底として使用されているクラスにフラグを設定します。このような階層では、virtual 基底は必要ありません。

トラブルシューティング

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

すべて展開する

この例では、線形階層 A->B->C 内のクラス B とクラス C でバーチャル基底クラスが使用されています。この階層では、バーチャル基底クラスを使用する必要はありません。使用すると混乱を招く可能性があります。Polyspace が違反を報告します。クラス階層 alpha->...->omega はダイヤモンド階層であり、このケースでは、バーチャル基底クラスを使用する必要があります。Polyspace はこのクラス階層にフラグを設定しません。

class A{};
class B: public virtual A{};
class C: public virtual B{}; //Noncompliant

class alpha{};

class beta: public virtual alpha{};
class gamma: public virtual alpha{};
class omega: public beta, public gamma{}; //Compliant

チェック情報

グループ: 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.