2011-06-11 5 views
4

C++で純粋仮想関数を実装する場合、実装も仮想化する必要があるというベストプラクティスのガイドラインがありますか?根拠は何ですか?バーチャルの実装も仮想化しますか?

class Interface 
{ 
    public: 
    virtual void foobar() = 0; 
}; 

class Concrete 
    : public Interface 
{ 
    public: 
    virtual void foobar(); 
}; 

答えて

13

これは問題ではありません。 Concrete

void foobar()かかわらず、あなたがそのように宣言し、それがInterfacevoid foobar()をオーバーライドするかどうかvirtualです。誰が作業するようvirtualキーワードは、派生クラスに存在しているかどうかは問題ではありませんが

+4

仮想関数が常に仮想のままであることはわかりませんでした。今日私はC++について何か学びました。 :D –

+0

それを知らなかった。私はあなたがそれをバーチャルのままにしておかなければならないと思った残念ながら、コンクリートオブジェクトを持っていることを知っていれば、コンパイラを仮想関数呼び出しから救うことができます。 –

+0

インターフェイスポインタを介してfoobar()を呼び出す場合、コンパイラはオブジェクトの実際の型を知る方法がないため、仮想関数呼び出しを強制します。しかし、コンクリートオブジェクトに対して直接foobar()を呼び出すと、コンパイラはvtableを経由するのではなく関数への直接呼び出しを自由に生成することができます。 – Ferruccio

7

、私はそれは常にに不可欠な時間を節約する自己文書の練習であることがわかってきましたが、それを含めます今から2年後のあなたのコードでは、すぐに目に会うものよりクラスに多くがあることがわかります。

+0

私はこれが実際にあなたが[オプションで] C++ 11で強制するようにコンパイラに指示できるルールの1つだと考えています。 –

+0

@Dennis:明示的な仮想関数オーバーライド**を考えていると思います**:http://en.wikipedia.org/wiki/C%2B%2B0x#Explicit_virtual_function_overrides –