1

我已经创建了自己的异常类,它派生自runtime_errorc'tor 并在 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") {}
};

请注意,我在基类中没有任何实际错误,它的唯一作用是使我能够在我将制作的未来自定义异常类上实现多态性。这就是为什么它只有一个纯粹的虚拟 d'tor。我不需要此类的任何“实际”对象BaseException

但是,当我尝试在 main 中捕获 baseException 并调用 what() 时,我做不到。我如何使它工作?

4

3 回答 3

4

第一个问题是你缺少析构函数声明中的 ,并且类名后面()有一个流氓。:

解决此问题后,您可能会收到如下错误:

error: pure-specifier on function-definition

由于某些只有 C++ 标准委员会知道的原因,纯虚函数不能像这样在类定义中实现。如果您希望它是纯虚拟的,那么您需要将定义移到类之外:

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

inline baseException::~baseException() {}

您还需要决定是从还是myException派生:在类头中使用一个,在构造函数的初始化程序列表中使用另一个。假设您使用的是标准异常类型,它可能应该通过(并且,如果您的头文件中有 a ,那么您应该删除它以避免破坏不希望全局命名空间被这样污染的代码)。runtime_exceptionruntime_errorstd::runtime_errorusing namespace std;

于 2012-06-18T12:21:53.100 回答
1

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

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

于 2012-06-18T12:21:35.630 回答
0

你忘了括号。它应该是

virtual ~baseException()=0 {}
于 2012-06-18T12:16:49.147 回答