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

时间:2015-01-21 06:32:56

标签: c++ virtual throw

在以下代码中:

#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”,我该怎么办?

1 个答案:

答案 0 :(得分:3)

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

catch(const Exception& e)

否则你就是&#34;切片&#34;例外,这是一个常见的错误。更不用说在飞行过程中复制异常是一个非常糟糕的主意 - 如果它需要分配内存来复制,它被抛出的原因是因为系统内存不足?

另外,您应该从std::exception中获取例外情况。