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

时间:2014-04-02 19:37:48

标签: c++ qt exception mingw

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

当我将以下代码放入main()函数的最顶层时(在Qt执行其所有操作之前),我在控制台上获得的输出是“std :: exception”,而不是“Whoops”as我希望:

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中编译的完全相同的代码按照我的预期输出“Whoops”。

std::exception::what()是虚拟的,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

正如克里斯所说,你是slicing the information。您可以通过捕获const引用(demo)来阻止这种情况:

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