9

次のコードが与えられたとします。

class A
{
public:
   virtual void someMethod()
   {
      std::cout << "class A" << std::endl;
   }
};

class B : public A
{
public:
   ...
   virtual void someMethod() = 0;
   ...
};

クラスは、仮想メソッドを純粋なB仮想メソッドでオーバーライドします。これを行う目的は、ケース class で変更することを許可されていない既存のクラスの拡張である可能性がありますが、さらにいくつかのクラスの基本クラスでなければならない抽象クラスをまだ持っています。someMethodAB

MISRA-C++ ルール 10-3-3によると: コード アナライザーは次の警告を出します:純粋仮想関数は非純粋仮想関数をオーバーライドします。

しかし、警告に関する詳細はあまり見つかりません。上記のコードの副作用は何ですか? ここで悪い習慣は何ですか?


更新: 標準は MISRA-C++ (C++98) です

4

2 に答える 2

5

ここには何の謎も見えません。コード アナライザーは、C++ 98 標準ではなく、MISRA 標準に対してコードをチェックしている可能性があります。

MISRA は自動車環境向けの C/C++ コーディング標準のセットであり、言語標準で合法/許可されていると思われるものにさらに制限を課しています。

純粋仮想関数で非純粋仮想関数をオーバーライドしていますが、これは明らかにコンパイラでは問題ありませんが、MISRA ルールでは問題ありません。

つまり、プログラムは正常にコンパイルおよび実行され、言語標準に準拠しますが、コードのレビューと MISRA 標準への準拠を必要とする顧客には受け入れられない可能性があります。

于 2013-09-28T10:45:42.317 に答える
3

あなたのコードは標準に従って有効であると思います:

§10.4

5 [注: 抽象クラスは抽象ではないクラスから派生させることができ、純粋仮想関数は純粋ではない仮想関数をオーバーライドすることができます。—終わりのメモ]

于 2013-09-28T10:33:52.830 に答える