版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
ObjectivesTounderstandthemechanismsofstaticanddynamicpolymorphismTobeabletodeclarevirtualfunctionsandknowhowtousethemTobeabletodefineanabstractbaseclass01WhatisPolymorphism?04AbstractBaseClasses02DynamicPolymorphismandVirtualFunctions03UnderstandingofVirtualFunctions05InheritingInterfaceandImplementation01WhatisPolymorphism?Polymorphismforanaddition(+)operator,a+
bi+
jcomplex1+complex2foraprint
function, voidprint(int);voidprint(int,char*);Forexample,Whatispolymorphism?Wordmeaning--manyformsPolymorphismmeansthatsomecodes(functions),operatorsorobjectsbehavedifferentlyindifferentcontextsusingauniformform.PolymorphismisoneofOOPkeyfeatures.Polymorphism-BindingBindingisanassociation,suchasbetweenidentifiers(variablesorfunctionnames)andoperations(atypeorthespecificfunctionbody).Allfunctionshaveauniqueaddress.So,whenthecompilerencountersafunctioncall,itreplacesthefunctioncallwithamachinelanguageinstructionthattellstheCPUtojumptotheaddressofthefunction.Polymorphism-BindingTherearetwotypesofbindingaccordingtothetimeatwhichabindingtakesplace:(1)Compile-timebinding(calledstatic
binding,earlybinding)
–staticpolymorphism(2)Run-timebinding(calleddynamicbinding,latebinding)–dynamicpolymorphismStaticBinding(Compile-Time)–StaticPolymorphismclass
baseClass{public:voidf(){cout<<"CallingbaseClass\n";}};class
derivedClass:public
baseClass{public:voidf(){cout<<"CallingderivedClass\n";}};intmain(){baseClassone;one.f();derivedClasstwo;two.f();return0;}Staticbindingmeansthecompilerisabletodirectlyassociatetheidentifiername(suchasafunctionorvariable)withamachineaddress.Result:CallingbaseClassCallingderivedClassStaticBinding–StaticPolymorphismResult:CallingbaseClassCallingbaseClassclass
baseClass{public:voidf(){cout<<"CallingbaseClass\n";}};class
derivedClass:public
baseClass{public:voidf(){cout<<"CallingderivedClass\n";}};voidfn(baseClass&bc){bc.f();}intmain(){baseClassone;fn(one);derivedClasstwo;fn(two);return0;}A
top-level
functionwithaparameterofbaseclassreferenceorpointeri.e.referredtoasthederived-to-baseconversion02DynamicPolymorphismandVirtualFunctionsDynamicBinding(Run-Time)–DynamicPolymorphismResult:CallingbaseClassCallingderivedClassclass
baseClass{public:virtual
voidf(){cout<<"CallingbaseClass\n";}};class
derivedClass:public
baseClass{public:voidf(){cout<<"CallingderivedClass\n";}};voidfn(baseClass&bc){bc.f();}intmain(){baseClassone;fn(one);derivedClasstwo;fn(two);return0;}DynamicBinding
referstolinkingafunctioncalltothecodethatwillbeexecutedonlyatruntime.Thecodeassociatedwiththeproceduredosenotknowuntiltheprogramisexecuted.virtualfunctionVirtualFunctionsShape+volume():int+print():voidCube-edge:int+volume():int+print():voidCuboidlength:intwidth:intheight:int+volume():int+print():voidCaseStudyDefineclassescubeandcuboidaccordingtothegivenUMLdiagram.Cube-edge:int+volume():int+print():voidCuboidlength:intwidth:intheight:int+volume():int+print():voidVirtualFunctionsclass
Shape{public:Shape(){}virtual
intvolume(){cout<<"Shape'svolume.\n";return0;}virtual
voidprint(){cout<<"Shape’sprint.\n";}};class
Cube:public
Shape{public:Cube(int
e):edge(e){}virtual
intvolume(){cout<<"Cube’svolume\n";returnedge*edge*edge;}voidprint(){cout<<edge<<endl;}private:int
edge;};class
Cuboid:public
Shape{public:Cuboid(int
l,int
w,int
h):length(l),width(w),height(h){}virtual
intvolume(){cout<<"Cubiod’svolume\n";returnlength*width*height;}voidprint(){cout<<length<<width<<height<<endl;}private:intlength,width,height;};voidfn(Shape&
s){
s.print();cout<<s.volume();}intmain(){Cubec1(10);Cuboidc2(10,20,30);fn(&c1);fn(&c2);return0;}intmain(){Cubec1(10);Cuboidc2(10,20,30);fn(c1);fn(c2);return0;}voidfn(Shape*s){
s->print();cout<<s->volume();}ExtensibilityShape+volume():int+print():voidCube-edge:int+volume():int+print():voidCuboidlength:intwidth:intheight:int+volume():int+print():voidSphere-radius:int+volume():int+print():voidBenefitofusingvirtualfunctionsExtensibilityclass
Sphere:public
Shape{public:Sphere(int
r):radius(r){}virtual
intvolume(){
cout<<"Sphere’svolume\n";
return3.14*(double)4*(double)radius*radius*radius/3;}virtual
voidprint(){cout<<radius<<endl;}private:intradius;};voidfn(Shape*s){
s->print();cout<<s->volume();}intmain(){Cubec1(10);Cuboidc2(10,20,30);Spheres(10);fn(&c1);fn(&c2);fn(&s);return0;}03UnderstandingofVirtualFunctionsTheWorkingPrincipleofVirtualFunctionsintmain(){Cubec1(10);cout<<"sizeofc1"<<sizeof(c1)<<endl;Cuboidc2(10,20,30);cout<<"sizeofc2"<<sizeof(c2)<<endl;return0;}(32-bitcompiler)sizeofc18sizeofc216VirtualFunctionTable—VTABLEThecompilercreatesasinglevirtualfunctiontable(VTABLE)foreachclassthatcontainsvirtualfunctions.ThecompileplacestheaddressesofvirtualfunctionsforthoseclassesintheVTABLE.Apointer(vptr)isplacessecretlyineachclasswithvirtualfunctions.ItpointstotheVTABLEforobjects.addressaddressaddressConversionsandInheritancevoidfn(Shape&
s){
s.print();cout<<s.volume();}intmain(){
Cubec1(10);
Cuboidc2(10,20,30);fn(c1);fn(c2);
return0;}intmain(){
Cubec1(10);
Shape&
s=c1;
s.print();cout<<s.volume();
Cuboidc2(10,20,30);
s=c2;
s.print();cout<<s.volume();return0;}derived-to-baseUnderstandingconversionsbetweenbaseandderivedclassesisessentialtounderstandinghowobject-orientedprogrammingworks.ConversionsandInheritancevoidfn(Shape*s){
s->print();cout<<s->volume();}intmain(){
Cubec1(10);
Cuboidc2(10,20,30);fn(&c1);fn(&c2);
return0;}intmain(){
Cubec1(10);
Shape*
s=&c1;
s->print();cout<<s->volume();
Cuboidc2(10,20,30);
s=&c2;
s->print();cout<<s->volume();
return0;}derived-to-baseConversionsandInheritancevoidmain(){
Shape
s;Cube
&c1=s;//errorCube
*c2=s;//error}Thisresultsinthatwemightattempttousec1orc2tousemembersthatdonotexistinShape.Thefactthatwecanbindareference(orpointer)toabase-classtypetoaderivedobjecthasacruciallyimportantimplication:Whenweuseareference(orpointer)toabase-classtype,wedon’tknowtheactualtypeoftheobjecttowhichthepointerorreferenceisbound.Thatobjectcanbeanobjectofthebaseclassoritcanbeanobjectofaderivedclass.ConversionsandInheritanceintmain(){
Cubec1(10);
Shape
s=c1;}ShapeCube’sdataCubeMemoryBecausetheCubeisignored,wesaythattheCubeportionofShapeissliceddown.intmain(){
Cubec1(10);
Shape
s;s=c1;}Shape(constShape&)Shape&operator=(constShape&)Theautomaticderived-to-baseconversionappliesonlyforconversionstoareferenceorpointertype.VirtualDectructorResult:ConstructingbaseclassConstructingderivedclassDosthinBase!BaseDestroyedConstructorcannotbevirtualfunction,butdestructoralwaysbevirtualfunction.class
Base{public:Base(){cout<<"Constructingbaseclass\n";}~Base(){cout<<"BaseDestroyed\n";}voidDoSomething(){cout<<"DosthinBase!\n";}};class
Derived:public
Base{public:Derived(){cout<<"Constructingderivedclass\n";}~Derived(){cout<<"Deriveddestroyed\n";}voidDoSomething(){cout<<"DosthinDerived!\n";}};intmain(){//upcastBase*pBase=new
Derived;pBase->DoSomething();deletepBase;return0;}BaseclasspointertothederivedclassobjectVirtualDectructorclass
Base{public:Base(){cout<<"Constructingbaseclass\n";}~Base(){cout<<"BaseDestroyed\n";}virtual
voidDoSomething(){cout<<"DosthinBase!\n";}};class
Derived:public
Base{public:Derived(){cout<<"Constructingderivedclass\n";}~Derived(){cout<<"Deriveddestroyed\n";}voidDoSomething(){cout<<"DosthinDerived!\n";}};intmain(){Base*pBase=new
Derived;//upcastpBase->DoSomething();deletepBase;}class
Base{public:Base(){cout<<"Constructingbaseclass\n";}virtual~Base(){cout<<"BaseDestroyed\n";}virtual
voidDoSomething(){cout<<"DosthinBase!\n";}};class
Derived:public
Base{public:Derived(){cout<<"Constructingderivedclass\n";}~Derived(){cout<<"Deriveddestroyed\n";}voidDoSomething(){cout<<"DosthinDerived!\n";}};Result:(withvirtual)ConstructingbaseclassConstructingderivedclassDosthinDerived!BaseDestroyedResult:ConstructingbaseclassConstructingderivedclassDosthinDerived!DeriveddestroyedBaseDestroyed04AbstractBaseClassesAbstractBaseClassesSomeclassesrepresentabstractconceptsforwhichobjectscannotexist,thatis,theycannotbeinstantiated,becauseatleastonefunctionintheseclassesdonotknowwhattobeimplemented.However,theyexistsextensivelyforinheritance,andmostlyusedasabaseclass.Theseclassesarecalledabstractbaseclasses.class
Shape{public:Shape(){}virtual
intvolume();virtual
voidprint();};AbstractBaseClassesAclasswhichcontainsoneormorepurevirtualfunctioniscalledabstractbaseclass.class
Shape{public:Shape(){}virtual
intvolume()=0;virtual
voidprint()=0;};PurevirtualfunctionAbstractbaseclassApurevirtualfunction
isavirtualfunctionwhichcontainsnodefinitioninthebaseclass.Youdeclareapurevirtualfunctionbyusingapurespecifier(=0)inthedeclarationofavirtualmemberfunctionintheclassdeclaration.AbstractBaseClassesclass
Shape{public:Shape(){}virtual
intvolume()=0;virtual
voidprint()=0;};intShape::volume(){return
0;}voidShape::print(){}wecanprovideadefinitionforapurevirtual.However,thefunctionbodymustbedefinedoutsidetheclass.Thatis,wecannotprovideafunctionbodyinsidetheclassforafunctionthatis=0.AbstractBaseClassesShapes;//error–cannotbeinstantiatedShape*s;//okShape&s;//okAnobjectpointerAnobjectreferenceYoucannotcreateanobjectofanabstractclasstype;However,youcanusepointers
orreferencestoabstractclasstypes.AbstractBaseClassesclass
Shape{public:Shape(){}virtual
intvolume()=0;};class
Cube:public
Shape{public:Cube(int
e):edge(e){}intvolume(){
cout<<"Cube’svolume\n";
returnedge*edge*edge;}private:
intedge;};class
Cuboid:public
Shape{public:
Cuboid(int
l,int
w,int
h):
length(l),width(w),height(h){}
intvolume(){
cout<<"Cubiod’svolume\n";
returnlength*width*height;}private:
intlength,width,height;};intmain(){Shape*s;Cubec1(10);Cuboidc2(10,20,30);fn(&c1);fn(&c2);return0;}voidfn(Shape*s){
cout<<s->volume();}05InheritingImplementationand
Inheriting
InterfaceMemberFunctionsandInheritancebase+f():int+g():voidderived+f():intDistinguishbetweeninheritinginterfaceandinheritingimplementation.Interface-Overriding-VirtualfunctionsImplementation-
MemberfunctionsoftheclassesThememberfunctionsofabaseclasscanbeinheritedbyitsderivedclassintwoways:(1)Whenaderivedclassneedstobeabletoprovideitsowndefinitionforoperations,thederivedclassneedstooverridethedefinitionofthoseinheritedfromthebaseclass-interface(2)itsderivedclassonlyinheritthosewithoutanychange-implementationOverloadingandOverridingclass
Base{public:virtual
intf()const{cout<<"Base::f()\n";return1;}virtual
voidf(string
s)const{cout<<s<<"isaparameterintheBaseclass\n";}virtual
voidg()const{cout<<"Base::g()\n";}};class
Derived1:public
Base{public:voidg()const{cout<<"Overridingg()inDerived1\n";}};intmain(){Derived1d1;intx=d1.f();d1.f("hello");d1.g();return0;}Result:Base::f()HelloisaparameterintheBaseclassOverridingg()inDerived1OverloadingandOverridingclass
Base{public:virtual
intf()const{cout<<"Base::f()\n";return1;}virtual
voidf(string
s)const{cout<<s<<"isaparameterintheBaseclass\n";}virtual
voidg()const{cout<<"Base::g()\n";}};class
Derived1:public
Base{public:voidg()const{cout<<"Overridingg()inDerived1\n";}virtual
intf()const{cout<<“Dervied1::f()\n";return1;}};intmain(){Derived1d1;intx=d1.f();d1.f("hello");//errord1.g();return0;}nomatchingfunctionforcallto'Derived1::f(constchar[6])
d1.Base::f("hello");//okAderivedclassmemberwiththesamenameasamemberofthebaseclasshidesthedirectuseofthebaseclassmember.class
Base{public:virtual
intf()const{cout<<"Base::f()\n";return1;}virtual
voidf(string
s)const{cout<<s<<"isaparameterintheBaseclass\n";}};OverloadingandOverridingclass
Base{public:virtual
voidg()const{cout<<"Base::g()\n";}};
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年公務(wù)員考試臺州市天臺縣《行政職業(yè)能力測驗》模擬試題含解析
- 智能化飼料機械生產(chǎn)項目可行性研究報告申請立項
- 2025年摩托車減震器鋁筒項目可行性研究報告
- 酒店消防知識培訓課件
- 手拉手活動參考計劃
- 春節(jié)農(nóng)品營銷策略
- 2025年小學藝體教研組工作計劃
- 烤肉知識培訓課件模板
- 二零二五年度工程承包合同關(guān)于建筑材料供應(yīng)與質(zhì)量保證
- 2025版高科技企業(yè)產(chǎn)權(quán)互換技術(shù)合作協(xié)議范本3篇
- 【可行性報告】2024年第三方檢測相關(guān)項目可行性研究報告
- 藏醫(yī)學專業(yè)生涯發(fā)展展示
- 信息安全保密三員培訓
- 2024新版《藥品管理法》培訓課件
- DB41T 2302-2022 人工影響天氣地面作業(yè)規(guī)程
- 【初中語文】2024-2025學年新統(tǒng)編版語文七年級上冊期中專題12:議論文閱讀
- 四川省成都市2022-2023學年高二上學期期末調(diào)研考試物理試題(原卷版)
- 四川新農(nóng)村建設(shè)農(nóng)房設(shè)計方案圖集川西部分
- OBE教育理念驅(qū)動下的文學類課程教學創(chuàng)新路徑探究
- 2024政務(wù)服務(wù)綜合窗口人員能力與服務(wù)規(guī)范考試試題
- 《陸上風電場工程設(shè)計概算編制規(guī)定及費用標準》(NB-T 31011-2019)
評論
0/150
提交評論