异常处理–将基类和派生类捕获为异常:
如果基类和派生类都被捕获为异常,则派生类的catch块必须出现在基类之前。
如果我们把基类放在首位,那么派生类的catch块将永远不会到达。例如,以下C++代码打印“ Caught Base Exception”(捕获的基本异常)
#include
using namespace std;
class Base {};
class Derived: public Base {};
int main()
{
Derived d;
// some other stuff
try {
// Some monitored code
throw d;
}
catch(Base b) {
cout<<"Caught Base Exception";
}
catch(Derived d) { //This catch block is NEVER executed
cout<<"Caught Derived Exception";
}
getchar();
return 0;
}
在上面的C++代码中,如果我们更改catch语句的顺序,则两个catch语句都可以到达。以下是经过修改的程序,并显示“捕获的派生异常”
#include
using namespace std;
class Base {};
class Derived: public Base {};
int main()
{
Derived d;
// some other stuff
try {
// Some monitored code
throw d;
}
catch(Derived d) {
cout<<"Caught Derived Exception";
}
catch(Base b) {
cout<<"Caught Base Exception";
}
getchar();
return 0;
}
在Java,编译器本身不允许在派生之前捕获基类异常。在C++中,编译器可能会对此发出警告,但会编译代码。
例如,以下Java代码在编译时失败,并显示错误消息“派生异常已被捕获”
//filename Main.java
class Base extends Exception {}
class Derived extends Base {}
public class Main {
public static void main(String args[]) {
try {
throw new Derived();
}
catch(Base b) {}
catch(Derived d) {}
}
}
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。