#include using namespace std; //(1)目的:多型Polymorphism,與動態繫結(dynamic binding) //(2)三層類別關係 //Ball----Football-----Superfootball // ....Baseball //father class 1 class Ball { public: virtual void show() { cout<<"\nI am a Ball"; } }; //son class 2 class Baseball : public Ball { public: void show() { cout<<"\nI am a Baseball"; } }; //son class 2 class Football : public Ball { public: void show() { cout<<"\nI am a Football. \t"; } virtual void price() { cout<<"price = 300 NT."; } }; //grandson class 3 //繼承上一層 Football class Superfootball : public Football { public: void show() { cout<<"\nI am a Superfootball. \t"; } void price() { cout<<"price = 900 NT."; } }; /////////////// int main(int argc, char** argv) { //1.多形 Ball * a1[3]; a1[0] = new Baseball; a1[0]->show(); //I am a Baseball a1[1] = new Football; a1[1]->show(); //I am a Football cout<show(); //I am a Superfootball //父類別,可以指揮,孫子類別 //2.動態繫結(dynamic binding) //新增:在『son類別Football,grandson類別Superfootball』都新增函數price(),但是父類別沒有price() //問題1:能否由父類別Ball指標變數,來指揮,子類別/孫子類別的price() //結果:==> 無法 Ball * a2 = new Football; //a2->price(); //無法執行 //3.改善方法: 動態繫結(dynamic binding) //原理:把父類別Ball==> 動態繫結到 ==>子類別Football,就可以了 //指令:dynamic_cast(Ball指標) cout<price()會出現錯誤 Baseball * x = new Baseball; //x->price(); cout<(a3[0])) f3[0]->price(); Ball * a3[3]; a3[0] = new Baseball; a3[0]->show(); Football * f3[3]; f3[0]= dynamic_cast(a3[0]); if(f3[0])f3[0]->price(); a3[1] = new Football; a3[1]->show(); f3[1]= dynamic_cast(a3[1]); if(f3[1])f3[1]->price(); a3[2] = new Superfootball; a3[2]->show(); f3[2]= dynamic_cast(a3[2]); if(f3[2])f3[2]->price(); cout<show(); //錯誤做法: //如果用 Football * f4 = new Football; 答案不對 //Football * f4 = new Football; //I am a Baseballprice = 300 NT. //I am a Football. price = 300 NT. //I am a Superfootball. price = 300 NT. //正確做法: Football * f4 = dynamic_cast(a4[i]); if(f4)f4->price(); //I am a Baseball //I am a Football. price = 300 NT. //I am a Superfootball. price = 900 NT. } return 0; }