-5

派生クラスの例外をスローする代わりに、派生クラスから基本クラスの例外をスローするコードを書きました

#include <iostream>
using namespace std;

class Base {
public:
  class BaseException {};
  class DerivedException : public BaseException {};
  virtual void f() throw(DerivedException) {
    throw DerivedException();
  }
  virtual void g() throw(BaseException) {
    throw BaseException();
  }
};

class Derived : public Base {
public:
  void f() throw (BaseException) 
  {
    throw BaseException();
  }
  virtual void g() throw (BaseException)
 {
    throw DerivedException();
  }
};

int main()
{
    Derived D;

    return 0;
}

http://codepad.org/xMdNAeVE

コンパイルに失敗し、

Line 18: error: looser throw specifier for 'virtual void Derived::f() throw (Base::BaseException)'
compilation terminated due to -Wfatal-errors.

ネットで検索したところ、派生クラスが基本クラスで行われた契約に違反しているようです。

私の疑問は、基本クラスが派生クラスオブジェクトの契約を結んだことですが、私は基本クラスを使用しているので、どこで契約が壊れていますか。

4

1 に答える 1

0

問題はここにあります:

virtual void Base::f() throw(DerivedException)

void Derived::f() throw(BaseException) 

基本的に、 (より特殊化された) 例外anyBase.fをスローすると約束しました。DerivedException次に、あなたDerived classはその約束を「リラックス」しようとしており、より一般的なBaseException. あるクラスを別のクラスから派生させる場合、それはできません。1 番目を に変更するthrow(BaseException)か、2 番目を に変更しthrow(DerivedException)ます。Derivedクラスはクラスによって行われた契約を制限Baseすることになり、それが許可されるため、両方を行うこともできます。

于 2013-06-22T14:03:53.287 に答える