首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异常多态c++

异常多态c++
EN

Stack Overflow用户
提问于 2012-06-18 20:11:26
回答 3查看 906关注 0票数 1

我已经创建了我自己的异常类,它从runtime_error派生,并在c‘’tor中获得一个int。

我想为这个异常创建一个基类,以便使用多态性,这样我只能捕获基类,基本上我将捕获派生类。

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

代码语言:javascript
复制
class baseException
{
    virtual ~baseException()=0 {}
};

这是派生类:

代码语言:javascript
复制
class myException: public runtime_error, public baseException
{
public:
    myException(int): runtime_error("Error occured") {}
};

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-18 20:21:53

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

一旦你修复了这个问题,你可能会得到如下的错误:

代码语言:javascript
复制
error: pure-specifier on function-definition

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

代码语言:javascript
复制
class baseException
{
    virtual ~baseException()=0;
};

inline baseException::~baseException() {}

您还需要决定myException是从runtime_exception派生的,还是从runtime_error派生的:一个在类头中使用,另一个在构造函数的初始值列表中使用。假设您使用的是标准异常类型,则可能应该使用std::runtime_error (并且,如果您的头文件中有using namespace std;,那么您应该删除它,以避免破坏不期望全局名称空间受到那样污染的代码)。

票数 4
EN

Stack Overflow用户

发布于 2012-06-18 20:21:36

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

此外,您还可以从runtime_exception派生(从AMP库?)但是调用runtime_error的构造函数(我假设是从std名称空间)。

票数 1
EN

Stack Overflow用户

发布于 2012-06-18 20:16:49

你忘了括号。它应该是

代码语言:javascript
复制
virtual ~baseException()=0 {}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11082574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档