#include using namespace std; //reference:https://tianchyi1955.pixnet.net/blog/post/222025260 //(1)目的:多型Polymorphism,與虛擬函數virtual //(2)用途:用父類別指標物件,可以指揮子類別的函數,這種功能,稱為多型 //二層類別 //Ball-------Baseball // .......Football //(3)結論:多型:宣告父類別的指標或參考,就可以控制所有子類別物件的能力 //前提1:前提是:父類別,子類別,都有相同的函數名稱(show())==>Overriding //前提2:父類別函數前面要加上 virtual,才能控制下方子類別的函數 //(4)多型必須條件:『Inheritance』繼承 +『Overriding』覆蓋+『Upcasting』向上轉型 //(5)何謂『『Overriding』覆蓋 //圖示:https://pic.pimg.tw/tianchyi1955/1528766735-1545167425.png //說明:子類別以只能使用父類別有宣告的子類別方法(method)-紅字method1,即使是子類別之方法有被覆寫,而無法使用子類別自身擴充之方法-method2, //(6)何謂『Upcasting』向上轉型 // 例如:建立子物件時直接向上轉型 // Father1 f = new Son1(); //建立子物件時直接向上轉型 // f.method1(); //呼叫方法(子物件方法) //father class class Ball { private: double color; double price; public: virtual void show() //void show() { cout<<"I am a Ball"<配置Baseball空間 //結果:呼叫Ball的函數 Ball * a4 = new Baseball; a4->show(); //I am a ball //4. Ball物件,如何呼叫Baseball的函數 //步驟1:父類別,子類別,都有相同的函數名稱(例如show() //步驟2:父類別Ball的函數show,前面必須加上virtual void show() //步驟3:必須宣告父類別的指標物件->配置Baseball空間 cout<show(); //I am a Baseball a5 = new Football; a5->show(); //I am a Football //結果:竟然用父類別指標物件,可以指揮子類別的函數 //結論1:多型:宣告父類別的指標或參考,就可以控制所有子類別物件的能力 //結論2:所以,父類別宣告的指標或參考,可以代表任何子類別物件 //前提1:但是前提是:父類別,子類別,都有相同的函數名稱(show()) //前提2:父類別函數前面要加上 virtual,才能控制下方子類別的函數 //5.宣告父類別指標陣列 Ball * a6[3]; a6[0] = new Baseball; a6[1] = new Football; a6[2] = new Ball; cout<show(); //I am a Baseball a6[1]->show(); //I am a Football a6[2]->show(); //I am a Ball return 0; }