- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第5章多态与抽象类 《面向对象程序设计》 五、多态与抽象类 内容提要 类型兼容规则 多态的概念 多态的分类 联编(绑定) 虚函数 抽象类与纯虚函数 5.1 类型兼容规则 class A { int a; } class B : public A { int b; } int main() { A a1,*pa; B b1; a1=b1; //派生类的对象赋值给基类对象 A ra=b1; //派生类的对象初始化基类对象的引用 pa=b1; //派生类对象的地址赋值给基类对象指针 } 类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。 为什么可以这么做呢? 通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际上具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。 类型兼容规则中所指替代包括以下情况: 1)派生类的对象可以赋值给基类的对象。即用派生类对象中从基类继承来的成员逐个赋值给基类对象的成员。 2)派生类的对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中从基类继承来的成员。 3)派生类的对象的地址可以赋值给基类的指针变量。但只能通过这个指针访问派生类中从基类继承来的成员,不能访问派生类中的新成员。 在替代之后,派生类对象就可以作为基类的对象使用,但只能访问从基类继承的成员。 类型兼容规则的应用 class A { public: int a; A(int x) { a = x;} void print(){ cout class A a= a endl;} int Geta() { return a;} }; class B : public A { public: B(int x):A(x) { } void print(){ cout class B a= a endl;} }; void func(A ptr) { cout ptr.Geta() + 22 endl; ptr.print(); } int main() { A a1(1); a1.print(); B b1(11); a1 = b1; //用派生类对象给基类对象赋值 a1.print(); B b2(22); A a2 = b2; //用派生类对象来初始化基类对象引用 a2.print(); B b3(33); A *a3 = b3; //把派生类对象的地址赋给基类对象指针 a3 - print(); B *b4 = new B(44); func(*b4); //函数参数是基类对象或基类对象引用或基类对象 //指针,实参可以是派生类对象 A *a4 = b4; //把派生类对象指针赋值给指向基类对象的指针 a4 - print(); delete b4; return 0; } 程序运行输出: class A a= 1 class A a= 11 class A a= 22 class A a= 33 66 class A a= 44 class A a= 44 程序说明: 1.在main()函数中,“A a1(1);”、“B b1(11);”、“a1=b1;”,用派生类对象b1给基类对象a1赋值;这样a1中的数据成员就得到了b1中与之相对应的数据成员的值。 2.如果有“A p;“A m=p;”,m是p的别名,m和p共享同一段存储单元。 3.“B b2(22);”、“A a2=b2;”,用派生类对象来初始化基类的引用。此时,a2并不是b2的别名,也不与b2共享同一段存储单元。它是b2中基类部分的别名,a2与b2共享基类部分的同一段存储单元,有相同的起始地址。 4.“B b3(33);”、“A *a3=b3 ;”,把派生类对象的地址赋给指向基类对象的指针变量。 5.“func(*b4);”,当函数func()的形参是基类对象或基类对象的引用或指针,实参可以是派生类对象,因为,派生类对象与基类对象类型兼容,派生类对象自动转换类型,最后输出类B的对象b4的基类数据成员。 class base{ public: void who(){cout”base class”endl;} }; class derive1:public base{ public: void who(){cout”derive1 class”endl
您可能关注的文档
最近下载
- 露天矿山岩质边坡工程设计规范(TCSRME 009-2021).pdf VIP
- 精品解析:2024年高中化学奥林匹克北京地区预选赛化学试题(解析版).docx VIP
- 国际音标练习(共52张).ppt VIP
- 部编版语文一年级上册教案-表格式(全册).pdf VIP
- 射血分数保留的心力衰竭诊断与治疗中国专家共识2025要点 .pdf VIP
- 2024年一级注册计量师考试题目解析.docx VIP
- 《新生儿高氨血症诊断与治疗的专家共识》解读PPT课件.pptx VIP
- 初中语文讲座:《素养导向初中语文大单元教学》课件.pdf
- 2019年阅兵PPT课件教学课件.pptx VIP
- 2025杭州电力设备制造有限公司招聘70人(第二批)笔试模拟试题及答案解析.docx VIP
文档评论(0)