关于 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
.
派生异常
在下面的代码中:
#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
.