首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从继承的异常类引发字符串异常

从继承的异常类引发字符串异常
EN

Stack Overflow用户
提问于 2021-03-01 21:31:37
回答 3查看 44关注 0票数 2

我实现了我的异常

继承自

如下所示:

代码语言:javascript
运行
复制
class MyException : public exception
{
public:
    MyException(string exc)
    {
        this->exc = exc;
    }

    const char * what() const throw ()
    {
        return exc.c_str();
    }

private:
    string exc;
};

现在我抛出

,并假设在我的

,但是我用两种不同的方法对它进行了测试。

部分:

正常捕获

尝试{抛出MyException("This is a exception");} catch (const std::exception exc) { MessageBoxA(NULL,exc.what(),"",MB

_

OK);}

使用引用捕获

尝试{抛出MyException(“这是一个异常”);} catch (const std::exception &exc) { MessageBoxA(NULL,exc.what(),"",MB

_

OK);}

抛出的第一个异常字符串是:

未知异常

和第二个抛出的异常(具有

在catch部分中)是:

这是一个例外

为什么我不能得到我的自定义异常

字符串

在没有引用的情况下正常使用catch时(

)为什么?

好的

通过引用?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-01 22:25:51

你正在经历

对象切片

..。

接收派生实例时会发生这种情况

价值

作为它的基类--在您的例子中,捕获

按值。您的派生类的成员在转换为基类的过程中被“切掉”。

当您希望以多态方式使用参数时,通过指针或(const)引用接收总是更可取的。用于捕获

你应该总是通过常量引用来捕捉(我真的想不出这样的场景

不会

)。

票数 1
EN

Stack Overflow用户

发布于 2021-03-01 21:36:30

你正在染上一种

通过值,编译器调用

你的数据就会丢失。

或者;

通过引用捕获异常,这不会导致复制。或者

捕捉

直接。

选项2仍然执行复制,这是多余的,所以我选择选项1。

票数 1
EN

Stack Overflow用户

发布于 2021-03-01 21:43:59

这是所有多态性都有的限制,而不仅仅是例外。

通过引用捕获时,将捕获对派生类的现有实例的引用,因此可以调用它们的虚方法。

当您通过值捕获时(您永远不应该这样做,这是原因之一),您会捕获一个

对象本身。因为

不是抽象的,这当然是可行的。但是,现在将为您提供一个新对象,其类型为

..。因此,它从来没有

成员,更重要的是,它没有

覆盖你想要的。取而代之的是,原始的定义

,因为您从未初始化基异常,所以它会打印出来。

..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66423058

复制
相关文章

相似问题

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