異常的類層次結構
虛擬函數
#include <iostream>
#include <string>
using namespace std;
class BaseExc{
public:
??? virtual void message()
??? {
??? ?cout<<"BaseExc"<<endl;
??? }
};
class DevidedExc:public BaseExc{
public:
??? void message()
??? {
??? cout<<"DevidedExc"<<endl;
??? }
};
class DevidedDevidedExc:public DevidedExc{
public:
??? void message()
??? {
??? cout<<"DevidedDevidedExc"<<endl;
??? }
};
void Throw(int num)
{
? if(num==0)
??? ? throw BaseExc();//拋出異常,這里不能是throw new BaseExc;也不能是throw BaseExc;表達式是一個構造函數的調用。? if(num==1)
??? ? throw DevidedExc();
? if(num==2)
??? ? throw DevidedDevidedExc();}
int main(int argc,char* argv[])
{
??? try{
??? char ch=cin.get();
??? int j=atoi(&ch);
??? if(j<0||j>2)
??? ??? return 1;
??? Throw(j);
??? }
??? catch(
BaseExc &e){//這里要是指針或者引用。如果是單純的對象,那么輸出只能是BaseExc
???? e.message();???
??? }
}
輸入0 BaseExc
輸入1 DevidedExc
輸入2 DevidedDevidedExc
//派生類的catch子句必須先出現。這確保了只有在沒有其他catch子句的時候,才會進入基類的catch子句。
int main(int argc,char* argv[])
{
??? try{
??? char ch=cin.get();
??? int j=atoi(&ch);
??? if(j<0||j>2)
??? ??? return 1;
??? Throw(j);
??? }
??? catch(DevidedDevidedExc &e)
??? {
??? ? e.message();
??? }
??? catch(DevidedExc &e)
??? {
??? e.message();
??? }
??? catch(BaseExc &e){
???? e.message();???
??? }
}