异常多态c ++

时间:2012-06-18 12:11:26

标签: c++ exception inheritance

我创建了自己的异常类,它派生自runtime_error并在c'tor中得到一个int。

我想为这个异常创建一个基类,为了使用多态,所以我只能捕获基类,基本上我会捕获派生类。

所以,这是基类:(在另一个cpp文件中我得到了baseException :: ~baseException(){})

class baseException
{
    virtual ~baseException()=0 {}
};

这是派生类:

class myException: public runtime_error, public baseException
{
public:
    myException(int): runtime_error("Error occured") {}
};

请注意,我在基类中没有任何实际错误,它的唯一作用是在我将来的自定义异常类中启用多态。 这就是为什么它只有一个纯虚拟的东西。我不需要这个BaseException类的任何“实际”对象。

虽然,当我尝试在main中捕获baseException并调用what()时,我不能。 我如何使它工作?

3 个答案:

答案 0 :(得分:4)

第一个问题是你从析构函数的声明中遗漏了(),并且在类名后面有一个流氓:

一旦你解决了这个问题,你可能会收到如下错误:

error: pure-specifier on function-definition

由于某些只有C ++标准委员会所知的原因,纯虚函数无法在类定义中实现。如果您希望它是纯虚拟的,那么您需要在类之外移动定义:

class baseException
{
    virtual ~baseException()=0;
};

inline baseException::~baseException() {}

您还需要确定myException是否来自runtime_exceptionruntime_error:您在类标头中使用一个,而在构造函数的初始化列表中使用另一个。假设您正在使用标准异常类型,它可能应该由std::runtime_error(并且,如果您的头文件中有using namespace std;,那么您应该删除它以避免破坏不期望的代码像这样被污染的全局命名空间。)

答案 1 :(得分:1)

如前所述,您需要使用括号和析构函数的非内联定义。

另外,你派生自runtime_exception(来自AMP库?)但是调用runtime_error的构造函数(来自我假设的std命名空间。)

答案 2 :(得分:0)

你忘记了括号。它应该是

virtual ~baseException()=0 {}