2017-01-22 6 views
3

CC::onErrorが以下の例でconstである必要がないのはなぜですか? BB:onErrorはconst以外のコンパイラエラーでなければなりません。派生クラスはいつメソッドをconstとして実装する必要がありますか?

BBはonErrorをconst elseコンパイラエラーとして実装する必要があります。

CCは非constとして実装できます。どうして?

class AA { 
public: 
    AA() {}; 
    virtual ~AA() {}; 

    // On any error 
    virtual void onError(int32_t error) const = 0; 
}; 

class BB : public AA { 
public: 
    BB() {}; 
    virtual ~BB() {}; 

    virtual void onError(int32_t error) const { 
     //changing x is invalid here due to const 
     //method required to be const else compiler error 
    } 
protected: 
    int x; 
}; 

class CC : public BB { 
public: 
    CC() {}; 
    virtual ~CC() {}; 

    virtual void onError(int32_t error) { 
     x = 5; 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CC c; 
    return 0; 
} 

答えて

0

AA::onError() constつまりあなたは子孫クラス(BB)での定義を提供しなければならない純粋仮想です。 constはメソッドシグネチャの一部であることに注意してください。

CCには祖先(BB)で定義されたonError() constがあり、BB::onError()を定義すると、その署名が異なるため、BB::onError() constは無効になりません。新しいメソッドを定義するだけです。

0

派生クラスの非constメソッドは、すべてのパラメータタイプが同じであっても、基本クラスのconstメソッドをオーバーライドできません。関数C::onErrorは、オーバーライドする代わりに関数B::onErrorを非表示にします。 B::onErrorの場合

それはA::onErrorとは異なるCV-資格を持っているため、それが合法であるが、A::onErrorが純粋であることから、具体的なクラスに到達するために一部非純粋overriderが存在しなければなりません。 B::onErrorおよびC::onErrorであり、両方とも非constの場合、Cは抽象クラスです。 Cではなく、が問題で、Bではなく、Cがインスタンス化しようとしています。

2

Why doesn't CC::onError need be const in the below example? 

メンバー関数はconstである必要はないので、

問題は、それがA::onErrorをオーバーライドすると予想され、そのためC++ 11がoverrideというキーワードを導入したのです。
これは微妙なエラーですが、実際にはA::onErrorを上書きしていないということです。実際にはA::onErrorを隠しているCの新しい仮想メンバー関数を宣言しています。
これを使用してみてください:

class CC : public BB { 
public: 
    CC() {}; 
    virtual ~CC() {}; 

    virtual void onError(int32_t error) override { 
     x = 5; 
    } 
}; 

コンパイラがエラー何明示的に教えてくれます:予想通り、他の側では

error: 'virtual void CC::onError(int32_t)' marked 'override', but does not override

、次のコードは、(正しいだろう、少なくともそれがA:onErrorを上書きします)しかし、あなたはxがされて変更することはできませんのために、それはコンパイルできないという事実のためonErrorconst

virtual void onError(int32_t error) const override { 
    x = 5; 
} 
mutableがわずかに異なる場合のために意味されるため

mutable int x; 

は、私は、それをお勧めしませんが、it works

は、場合を除き、もちろん、あなたがxmutableとして定義します。

+0

@Thedizようこそ。将来の読者が探している情報をすばやく見つけられるように、この質問や別の質問を受け入れることを忘れないでください。すべての参加者がそうする限り、SOは貴重なツールです。 ;-) – skypjack

関連する問題