欢迎来到天天文库
浏览记录
ID:40840770
大小:970.51 KB
页数:96页
时间:2019-08-08
《C程序设计(4-12)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C++程序设计理学院信息与计算科学系杨波cookie_yb73@126.com第四部分高级编程第12章多态(Polymorphism)第12章多态1.继承召唤多态2.抽象编程的困惑3.多态性的概念4.虚函数5.避免虚函数误用6.精简共性的类7.多态编程8.类型转换1.继承召唤多态子类是父类的一种父类不是子类的一种常见父类与子类的操作指针父类指针操作父类对象(自然)子类指针操作子类对象(自然)父类指针操作子类对象(将子类看成父类的一种,安全)子类指针操作父类对象(将父类看成子类的一种,不合理,危险)引用父类引用作为父类对象别名(自然)子类引用作为子类对象别名(自然)父类引用作为子类对象别名(
2、将子类看成父类的一种,安全)子类引用作为父类对象别名(将父类看成子类的一种,不合理,危险)例12-1源代码e1201.cppintdgetA()DeriintbgetB()BaseDeridd1;Base*pbtr=&dd1;pbtr派生类对象作为基类对象合理裁去专属于派生类部分强制类型转换intdgetA()DeriintbgetB()BaseBasebb1;Deri*pdtr=(Deri*)&bb1;pdtr基类对象作为派生类对象不合理覆盖父类操作如果父类中有一个操作,在子类中没有重新定义,则子类可以沿用该操作,但都是父类操作。子类可以进行同名覆盖,进行子类操作例12-2源代码e120
3、2.cpp同化效应例12-3源代码e1203.cpp渴望多态设立一个学生缴费办公室,处理全校学生的缴费工作:classStudent{public:doublecalcTuition(){…}…};classGraduateStudent:publicStudent{public:doublecalcTuition(){…}…};classUnderGraduateStudent:publicStudent{Public:doublecalcTuition(){…}…};voidmain{UnderGraduateStudentus1,us2;GraduateStudentgs1,gs2;
4、??????}渴望多态设立一个学生缴费办公室,处理全校学生的缴费工作:classStudent{public:doublecalcTuition(){…}…};classGraduateStudent:publicStudent{public:doublecalcTuition(){…}…};classUnderGraduateStudent:publicStudent{Public:doublecalcTuition(){…}…};voidmain{UnderGraduateStudentus1,us2;GraduateStudentgs1,gs2;std::vector5、*>v;v.push_back(&us1);v.push_back(&us2);v.push_back(&gs1);v.push_back(&gs2);for(inti=0;icalcTuition();}一个操作随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态渴望多态设立一个学生缴费办公室,处理全校学生的缴费工作:classStudent{public:doublecalcTuition(){…}…};classGraduateStudent:publicStudent{pub6、lic:doublecalcTuition(){…}…};classUnderGraduateStudent:publicStudent{Public:doublecalcTuition(){…}…};voidmain{UnderGraduateStudentus1,us2;GraduateStudentgs1,gs2;std::vectorv;v.push_back(us1);v.push_back(us2);v.push_back(gs1);v.push_back(gs2);for(inti=0;i7、dent&x){x.calcTuition();}一个操作随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态2.抽象编程的困惑类型域方案可以做到,即实现fn函数如下:voidfn(Student&x){switch(x.type){caseStudent::UNDERGRADUATESTUDENT:UnderGraduateStudent&ugsrx=static_cast
5、*>v;v.push_back(&us1);v.push_back(&us2);v.push_back(&gs1);v.push_back(&gs2);for(inti=0;icalcTuition();}一个操作随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态渴望多态设立一个学生缴费办公室,处理全校学生的缴费工作:classStudent{public:doublecalcTuition(){…}…};classGraduateStudent:publicStudent{pub
6、lic:doublecalcTuition(){…}…};classUnderGraduateStudent:publicStudent{Public:doublecalcTuition(){…}…};voidmain{UnderGraduateStudentus1,us2;GraduateStudentgs1,gs2;std::vectorv;v.push_back(us1);v.push_back(us2);v.push_back(gs1);v.push_back(gs2);for(inti=0;i7、dent&x){x.calcTuition();}一个操作随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态2.抽象编程的困惑类型域方案可以做到,即实现fn函数如下:voidfn(Student&x){switch(x.type){caseStudent::UNDERGRADUATESTUDENT:UnderGraduateStudent&ugsrx=static_cast
7、dent&x){x.calcTuition();}一个操作随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态2.抽象编程的困惑类型域方案可以做到,即实现fn函数如下:voidfn(Student&x){switch(x.type){caseStudent::UNDERGRADUATESTUDENT:UnderGraduateStudent&ugsrx=static_cast
此文档下载收益归作者所有