-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. 当您从另一个类派生一个类时,您不能这样做。将第一个更改为throw(BaseException)或将第二个更改为throw(DerivedException)。你甚至可以两者都做,因为那样的话Derived班级会限制班级签订的合同Base是允许的。

于 2013-06-22T14:03:53.287 回答