C++面向对象程序设计双语教程(第3版)课件 class 13-Polymorphism_第1页
C++面向对象程序设计双语教程(第3版)课件 class 13-Polymorphism_第2页
C++面向对象程序设计双语教程(第3版)课件 class 13-Polymorphism_第3页
C++面向对象程序设计双语教程(第3版)课件 class 13-Polymorphism_第4页
C++面向对象程序设计双语教程(第3版)课件 class 13-Polymorphism_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论