メインコンテンツ

AUTOSAR C++14 Rule A10-2-1

Non-virtual public or protected member functions shall not be redefined in derived classes

説明

ルール定義

Non-virtual public or protected member functions shall not be redefined in derived classes.

根拠

非バーチャル パブリック関数または保護されているメンバー関数が派生クラスで再定義されると、派生クラスの新しい定義により、基底クラスの定義がオーバーライドされるのではなく、隠されます。派生クラスで関数が隠されると、同じ階層の異なるクラスを処理するための共通インターフェイスを実装できず、不必要な複雑度やエラーが発生します。このような動作は予期されておらず、解決が難しいバグにつながる可能性があります。

プライベート継承による関数または基底クラスでプライベートである関数の再定義は、このルールの影響を受けません。

Polyspace 実装

Polyspace® は、派生クラスの非バーチャル メンバー関数の再定義にフラグを設定します。Polyspace は、デストラクターのこの欠陥を報告しません。

許容可能と判断した再定義を正当化するには、注釈を使用します。コードへの注釈付けと既知の結果または許容可能な結果の非表示を参照してください。

トラブルシューティング

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

すべて展開する

class A
{
  public:
    virtual ~A() = default;
    void F() noexcept {}
    virtual void G() noexcept {}  
  private:    
    void H() noexcept;
};

class B : public A 
{
  public:    
    void F() noexcept {} //Noncompliant    
    void G() noexcept override {} //Compliant 
};

この例では、関数 A::F() が非バーチャル パブリック メンバー関数であり、B クラスにより隠されています。A::F() が隠されると、ポリモーフィック インターフェイスを使用できなくなるため、Polyspace は B::F() での再定義に非準拠としてフラグを設定します。関数 A::G() はバーチャルであり、B::G() で (隠されるのではなく) オーバーライドされるため、Polyspace はこの実装に非準拠としてフラグを設定しません。

チェック情報

グループ: 派生クラス
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入