gpt4 book ai didi

c++ - std::exception 的 What() 方法不是虚拟的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:18:36 27 4
gpt4 key购买 nike

所以在引用手册中,what() 方法被描述为虚拟的,但它似乎并没有那样做。 (我正在使用 g++ 和 c++11 标志进行编译)

#include <stdio.h> //printf
#include <iostream> //cout
#include <stdexcept>// std::invalid_argument
using namespace std;

void fn(){
throw runtime_error("wowwowo");
}

int main(){
try {fn(); }
catch(exception a) {cout << a.what() << endl;}
return 0;
}

此输出是“std::exception”,而不是错误消息“wowwowo”。但是,如果我将捕获类型更改为 runtime_error,它会按预期运行。我有一些代码,我想在其中捕获可能是或可能不是 runtime_errors 的异常,并且我想我可以有多个 catch block ,但我很好奇为什么代码会这样运行。这是打印出错误消息的代码:

#include <stdio.h> //printf
#include <iostream> //cout
#include <stdexcept>// std::invalid_argument
using namespace std;

void fn(){
throw runtime_error("wowwowo");
}

int main(){
try {fn(); }
catch(runtime_error a) {cout << a.what() << endl;}
return 0;
}

最佳答案

更改此语句:

catch(exception a) {cout << a.what() << endl;}

为此:

catch(const exception &a) {cout << a.what() << endl;}

您必须通过引用 捕获异常,以便它使用多态性。否则,您将对 std::runtime_error 对象进行切片,因此仅保留 std::exception 对象,因此 std::exception::what() 将被调用而不是 std::runtime_error::what()

至于函数本身,确实是一个函数。

class exception {
public:
//...
virtual const char* what() const noexcept;
};

关于c++ - std::exception 的 What() 方法不是虚拟的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405481/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com