2013-09-28 15 views
9

次のコードが与えられたとします。 純粋 -virtual方法と仮想関数オーバーライド仮想関数

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

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

クラスBオーバーライドsomeMethod仮想メソッド。 これを行う目的は、私たちのケースクラスAでは変更できない既存のクラスの拡張であるかもしれませんが、さらにいくつかのクラスの基本クラスでなければならない抽象クラスBを持っています。

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

しかし、私は警告に関する詳細を見つけることができません。上記のコードの副作用は何ですか?ここで悪い練習は何ですか?


UPDATE:標準MISRA-C++(C++ 98)である

+0

これは、C++ 11のvirt指定子 'final'の貧弱なバージョンですか? (C++ 11 10.3p4) – WhozCraig

+0

警告が出たら、[std :: is_abstract](http://en.cppreference.com/w/cpp/types/is_abstract)は何ですか? – raina77ow

+0

更新された質問を確認してください、標準はC++ 98 – deimus

答えて

5

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

MISRAは自動車環境のためのC/C++コーディング標準のセットであり、これはおそらく言語規格によって合法的に許可されているものにさらに制限を課す。

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

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

+0

はい、あなたは絶対に正しいです、私はC++ 11の関連機能が指摘されているように、C++ 98を言及します。 – deimus

+0

私はそれをルールとして受け入れるつもりです。 – deimus

3

は、私はあなたのコードは、標準ごととして有効であると言うだろう:

10.4

§

5 [注:抽象クラスは、抽象クラスではない抽象クラスであるから派生させることができ、純仮想関数は、純粋でない仮想関数をオーバーライドすることができます。 --end note]

+1

誤って警告するのはコンパイラではありません。それはMISRAのルールです –

+0

それは誤った報告ではありません。 MISHAはそのことを_badの練習と見なします_。 (A :: SomeMethod()を仮想純粋と宣言してみませんか?)それは、他のいくつかのMISHAが規定するように、虐待とみなされるかもしれません。 – Jarod42

+0

サイドノート:これはC++ 98とC++ 11の両方で* same *です。引用されたセクションと段落の注釈を含めて、2つの間に違いは見られません。 – WhozCraig

関連する問題