




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 炎德英才大联考2025届化学高二下期末综合测试模拟试题含解析
- 江西省抚州第一中学2025届高二下化学期末达标检测模拟试题含解析
- 广东省东莞市第四高级中学2025年高一下化学期末调研模拟试题含解析
- 美洲原住民文明演变-第1篇-洞察及研究
- 有机糖果市场潜力-洞察及研究
- 软胶囊抗病毒活性研究-洞察阐释
- 机器学习在风机噪声控制中的创新应用-洞察阐释
- 麻纤维纺纱设备研发-洞察阐释
- 2025届广东省揭阳市揭东区高一化学第二学期期末教学质量检测试题含解析
- 大数据与人工智能驱动的化工产品批发行业创新-洞察阐释
- 2024年xx中学学生校服选用采购实施方案
- DL∕T 2622-2023 1000kV高压并联电抗器局部放电现场测量技术导则
- 农活承揽合同
- JT-T-1270.3-2019公路桥梁梳齿板伸缩装置第3部分:整体锚固式伸缩装置
- 广东省茂名市2023-2024学年八年级下学期期末数学试题
- 辽宁省沈阳沈河区七校联考2024届物理八下期末考试试题及答案解析
- DZ∕T 0221-2006 崩塌、滑坡、泥石流监测规范(正式版)
- 小学英语祈使句练习题
- 1例2型糖尿病酮症酸中毒伴心衰患者的护理
- 危化品仓库标准
- 《陆上风电场工程设计概算编制规定及费用标准》(NB-T 31011-2019)
评论
0/150
提交评论