C++面向?qū)ο蟪绦蛟O(shè)計雙語教程(第3版)課件 class 13-Polymorphism_第1頁
C++面向?qū)ο蟪绦蛟O(shè)計雙語教程(第3版)課件 class 13-Polymorphism_第2頁
C++面向?qū)ο蟪绦蛟O(shè)計雙語教程(第3版)課件 class 13-Polymorphism_第3頁
C++面向?qū)ο蟪绦蛟O(shè)計雙語教程(第3版)課件 class 13-Polymorphism_第4頁
C++面向?qū)ο蟪绦蛟O(shè)計雙語教程(第3版)課件 class 13-Polymorphism_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論