为什么 MinGW 4.8 不将 ex.what() 视为虚拟

Why does MinGW 4.8 not treat ex.what() as virtual?

本文关键字:虚拟 what ex MinGW 不将 为什么      更新时间:2023-10-16

我正在使用Qt Creator 3.0.1和MinGW 4.8 32位作为编译器。

当我将以下代码放入main()函数的最顶部(在Qt完成所有操作之前)时,我在控制台上得到的输出是"std::exception",而不是我期望的"Whoops":

try {
    throw std::logic_error{"Whoops"};
}
catch (std::exception ex) {
    std::cout << ex.what() << std::endl;
}

我还尝试通过指针访问what()

try {
    throw std::logic_error{"Whoops"};
}
catch (std::exception ex) {
    std::exception* ex2 = &ex;
    std::cout << ex2->what() << std::endl;
}

在VS2013中编译的完全相同的代码输出"哎呀",正如我所期望的那样。

std::exception::what()是虚拟的,那么为什么会这样呢?

正如克里斯所说,你正在切割信息。您可以通过捕获常量引用来防止这种情况(演示):

try {
    throw std::logic_error{"Whoops"};
} catch (const std::exception& ex) {
    std::cout << ex.what() << std::endl; // Whoops
}