派生クラスの例外をスローする代わりに、派生クラスから基本クラスの例外をスローするコードを書きました
#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;
}
コンパイルに失敗し、
Line 18: error: looser throw specifier for 'virtual void Derived::f() throw (Base::BaseException)'
compilation terminated due to -Wfatal-errors.
ネットで検索したところ、派生クラスが基本クラスで行われた契約に違反しているようです。
私の疑問は、基本クラスが派生クラスオブジェクトの契約を結んだことですが、私は基本クラスを使用しているので、どこで契約が壊れていますか。