关于 C++ 中异常的虚函数

About an exception's virtual function in C++

在下面的代码中:

#include <iostream>
class Exception{
public:
    virtual void print(){
        std::cerr << "Exception\n";
    }
};
class NullPointerException : public Exception{
public:
    void print(){
        std::cerr << "NullPointerException\n";
    }
};
int main(){
    try{
        throw NullPointerException();
    }catch(Exception e){
        e.print();
    }
    return 0;
}

为什么G++编译的程序打印的是"Exception"而不是"NullPointerException"。想要"NullPointerException"怎么办?

你应该总是通过引用来捕捉。 Const 引用也不是一个坏主意,因为您通常不需要修改异常:

catch(const Exception& e)

否则你就是"slicing"例外,这是一个常见的错误。更不用说在异常发生时复制异常是一个非常糟糕的主意--如果它需要分配内存来复制,而抛出的原因是系统内存不足怎么办?

顺便说一句,您可能应该从 std::exception.

派生异常