《Function基本概念.ppt》由会员分享,可在线阅读,更多相关《Function基本概念.ppt(20页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、XMUniversityXMUniversityVirtual FunctionVirtual Function基本概念n基礎類別定義基本的功能n衍生類別n繼承了基礎類別n定義特殊的功能classAnimalweighteat()SetWeight()classCateat()SetWeight()Sleep()動物的基本功能動物的基本功能貓的功能貓的功能classAnimalpublic:intweight;voideat();voidsetWeight();classCat:publicAnimalpublic:voideat();voidsetWeight();voidSleep();c
2、lassAnimalweighteat()SetWeight()classCateat()SetWeight()Sleep()動物的基本功能動物的基本功能貓的功能貓的功能Virtual Function基本概念基本概念Virtual Function基本概念n貓有貓的吃飯方式!classAnimalweighteat()SetWeight()classCateat()SetWeight()Sleep()動物的基本功能動物的基本功能貓的功能貓的功能Cat*Mycat=newCat();Mycat-eat();Virtual Function基本概念因為貓是動物的一種,所以我們可以用動物refer
3、ence貓Cat*Mycat=newCat();Animal*obj=Mycat;obj-eat();classAnimalweighteat()SetWeight()classCateat()SetWeight()Sleep()動物的基本功能動物的基本功能貓的功能貓的功能?Polymorphism(多形)Virtual Function基本概念n呼叫貓的eat():加入virtual關鍵字classAnimalweighteat()virtualSetWeight()classCateat()SetWeight()Sleep()動物的基本功能動物的基本功能貓的功能貓的功能Cat*Mycat=
4、newCat();Animal*obj=Mycat;obj-eat();範例程式:virtualConcept1.cppvirtual只要是Animal型別就可以操作n可以視為Animal型態操作,又可呼叫自己特別function.n泛型處理Animal透過Animal存取未知物件的相對應的function介面的概念n建立一個功能n只接受某種型態的物件n某些電器需要的是三孔插座,某些電器需要的是220V的電壓我是三孔插座我是220V插頭必須是三孔電壓一定要符合220V電器1電器2電力公司服務介面的概念n接受電力公司提供服務的條件n擁有三孔插座n可接受 220V 電壓若想接受服務,則電器(物件)
5、必須符合條件!120V電視機3孔介面220V介面120V電視機3孔介面220V介面classPlug3virtualpublicvoidInput3()=0;classVolate220VvirtualpublicvoidInput220V()=0;classTV:publicPlug3,publicVolate220public:voidinput3()voidinput220V();把3孔轉2孔的轉換程式放在這把220轉120V電壓轉換程式放在這虛擬解構式classSortableclassPerson假設 Person 繼承 SortableSortable*sp;Person*pp=n
6、ewPerson(Frank,frankicce.rug.nl,3633688);/使用基礎類別指標使用基礎類別指標 reference Person sp=pp;請問下面的程式碼,會呼叫 Sortable 還是Person 的解構子?deletesp;若若不加入不加入 virtual 在在sp的解構式中的解構式中,則則 delete sp 會呼叫會呼叫 sp的解構子的解構子,而非而非 Person的解構子的解構子範例程式:VirtualDestructor.dsw虛擬解構式nC+允許允許解構式虛擬化解構式虛擬化,以確定呼叫正確的解構式以確定呼叫正確的解構式classSortable/virt
7、ualSortable()如此deletesp;才會呼叫正確的正確的Person的解構式所以應該在基礎類別Sortable的解構式中加入virtual.問題問題:DeleteDerived會呼叫會呼叫Derived虛擬解構式虛擬解構式,但是但是程式會繼續呼叫程式會繼續呼叫Base的解構式嗎的解構式嗎?我們知道在Sortable的解構子加上virtual後,執行deletesp;會呼叫目前指向物件的解構子Sortable*sp;Person*pp=newPerson(Frank,frankicce.rug.nl,3633688);/使用基礎類別指標使用基礎類別指標 reference Perso
8、n sp=pp;deletesp;classSortableclassPerson1.執行執行Person的解構子的解構子2.執行執行Sortable的解構子的解構子解構的順序為 Derived()-Base()多重繼承下的虛擬函式 n一個衍生類別可能繼承多個基礎類別繼承多個基礎類別考慮下面的考慮下面的 code classBasepublic:voidsetfield(intval)field=val;intgetfield()constreturn(field);private:intfield;classDerived:publicBase,publicBase;注意注意:這裡重複繼承了
9、這裡重複繼承了Base呼叫哪一個呼叫哪一個Base的的getfield()voidmain()Derivedobj;obj.getfield();問題:多重繼承下的虛擬函式n程式很大的時候,則會亦有類似狀況(因為基礎類別可能不是你寫的)n多重繼承推導圖與內部結構圖重複繼承了重複繼承了Vechicle佔用了兩份空間佔用了兩份空間解決方法:虛擬繼承 Virtual Base classes n對於一個AirAuto,我們只須要一個weight.classLand:virtualpublicVehicle.;classAir:virtualpublicVehicle.;虛擬繼承與虛擬函數不同的地方在
10、於虛擬繼承完全可以在虛擬繼承完全可以在compile-time解析解析完整程式範例:VirtualDerived.dsw執行時期的形態辨別 n一個基礎類別基礎類別的指標,可能指的是衍生類別衍生類別.n那麼我們在執行的時候,要如何如何知道這個基礎類別指標到底是知道這個基礎類別指標到底是指向哪一個物件指向哪一個物件?動物*p=new貓;class動物class貓重要觀念:貓是動物的一種.所以我們可以用動物存取貓.Why?使得任何的動物種類的物件都可以用p存取.這就是抽象化,C+的解決方案ntypeid指出目前的指標到底是那一種型態指出目前的指標到底是那一種型態.(傳回字串告訴傳回字串告訴你你)nd
11、ynamic_cast運算子來將一個指標運算子來將一個指標轉換轉換成成基礎類別型態基礎類別型態或或衍生類別型態衍生類別型態.在VC中,必須設定才允許使用dynamic_cast.project-setting.-C+-C+Language:EnableRun-TimeTypeInformation(RTTI)typeid 範例1考慮下面的code#includevoidmain()couttypeid(12).name()endl;couttypeid(3.14).name()endl;會印出會印出int會印出會印出double必須先#include在class中至少要有一個virtualfunction看typeid範例2.docdynamic_cast 範例Seedynamic_cast.doc