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

C++ 为什么MinGW 4.8不将ex.what()视为虚拟的?,c++,qt,exception,mingw,C++,Qt,Exception,Mingw,我使用QtCreator3.0.1和MingW4.8 32位作为编译器 当我将以下代码放入main()函数的最顶层时(在Qt完成所有工作之前),我在控制台上得到的输出是“std::exception”,而不是我所期望的“哎哟”: try { throw std::logic_error{"Whoops"}; } catch (std::exception ex) { std::cout << ex.what() << std::endl; } VS201

我使用QtCreator3.0.1和MingW4.8 32位作为编译器

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

try {
    throw std::logic_error{"Whoops"};
}
catch (std::exception ex) {
    std::cout << ex.what() << std::endl;
}
VS2013中编译的代码与我所期望的完全相同,输出“哎哟”

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

正如克里斯所说,你是虚拟的。您可以通过捕获常量引用()来防止这种情况:

试试看{
抛出std::逻辑_错误{“哎哟”};
}捕获(const std::exception&ex){

std::cout See.
ex
是一个
std::exception
,无论是静态还是动态。我只是在查看上面发布的@chris链接后发现了这一点。我会在7分钟内接受,如果允许的话:)
try {
    throw std::logic_error{"Whoops"};
}
catch (std::exception ex) {
    std::exception* ex2 = &ex;
    std::cout << ex2->what() << std::endl;
}
try {
    throw std::logic_error{"Whoops"};
} catch (const std::exception& ex) {
    std::cout << ex.what() << std::endl; // Whoops
}