2012-04-02 21 views
20

私は機能が似ているCPPで宣言を持っている:仮想ボイドfuncFoo()const = 0と仮想ボイドfuncFoo()= 0の違い。

virtual void funcFoo() const = 0; 

私は明示的に宣言されている場合、それは別のクラスによって継承できると仮定しますが、どのような

virtual void funcFoo() = 0; 

の違いはありますが重要です私のプログラミングを改善し、その違いを知りたい。私は悪い継承によって引き起こされる誤動作を望んでいません。

ありがとうございます。

+2

http://stackoverflow.com/questions/:

を見てみましょう751681 /意味の最後のACメソッド宣言 – vid

+4

短い答え: 'const'正当性。 – iammilind

答えて

31

最初の署名は、このメソッドが派生型のconstインスタンスで呼び出すことができることを意味します。 2番目のバージョンはconstインスタンスで呼び出すことはできません。それらは異なるシグネチャであるため、2番目の実装では、最初のバージョンを実装またはオーバーライドしていません。

struct Base { 
    virtual void foo() const = 0; 
}; 

struct Derived : Base { 
    void foo() { ... } // does NOT implement the base class' foo() method. 
}; 
+7

+1は互いに上書きしないことを言います。 –

+3

いいえ、それ以外の方法です:最初の関数はconstインスタンスと非constインスタンスの両方で呼び出すことができますが、2番目のインスタンスは非constインスタンスでのみ呼び出すことができます(複雑なことはわかっていますが、 –

+0

すばらしい説明! – BajaBob

11

最初の関数はconstオブジェクトで呼び出すことができますが、2番目の関数は呼び出すことができません。さらに、最初の関数は、同じオブジェクト上の他のconstメンバ関数だけを呼び出すことができます。継承に関しては、同じように動作します。

このトピックのC++ FAQも参照してください。

3

2つの仮想関数は異なる署名を持ちますが、継承は同じ方法で動作します。前者はconstメソッドであり、const演算(メソッド)とオブジェクトのみをサポートすることができます。

1

CONST方法が呼び出されることができる

virtual void funcFoo() = 0; 

の差を使用して、このクラスのCONSTインスタンスに呼び出される

virtual void funcFoo() const = 0; 

ようにオブジェクトの状態を変更することはできません非定常的な場合にのみ。 C++のconstロジックについてgoogleを試してみてください。 http://en.wikipedia.org/wiki/Const-correctness

14
virtual void funcFoo() const = 0; 
- You can't change the state of the object 
- You can call this function via const objects 
- You can only call another const member functions on this object 

virtual void funcFoo() = 0; 
- You can change the state of the object 
- You can't call this function via const objects 

私はconstのcorrectectnessについて見た中で最高のチュートリアルやよくある質問parashiftによってC++のFAQた:http://www.parashift.com/c++-faq-lite/const-correctness.html

+0

これは最高の答えです。私が混乱させる唯一のことは、 'const'オブジェクトが何であるかを理解することです。 –