欢迎来到天天文库
浏览记录
ID:50041123
大小:421.50 KB
页数:25页
时间:2020-03-08
《C++程序设计 教学课件 作者 郑莉第11章多态性.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1第11章多态性清华大学郑莉2目录11.1多态性概述11.2虚函数11.3抽象类311.1多态性概述多态是指同样的消息被不同类型的对象接收时导致不同的行为消息是指对函数的调用不同的行为是指不同的实现,也就是调用了不同的函数加法运算符“+”:可以实现整型数之间、浮点数之间、双精度浮点数之间,以及他们相互之间的运算。同样的消息(相加),被不同类型的对象(可能为整型数、浮点数、双精度数)接受后,不同类型的对象采用不同的加法运算411.1多态性概述面向对象的多态性可以分为四类重载多态:全局函数和类的成员函数重载、整数之间、浮点数之间的加法等,第13章将要讲述
2、的运算符重载,都是重载多态强制多态:将一个对象的类型加以强制转换,以符合一个函数或者操作的类型要求。整型和浮点数的加法,将整型数强制转换为浮点数,就是强制转换包含多态:类族中不同类的同名函数的多态行为,主要通过虚函数体现参数多态:与将在第14章中介绍的类模板相关联前两种称为专用多态,后两种称为通用多态511.2.1一般虚函数成员将类的某个成员函数用virtual关键字声明得到的函数就是虚函数定义格式为:virtual返回类型函数名(形参表){函数体}虚函数的作用:如果将基类的某个成员函数声明为虚函数,而派生类重写该函数,则在向上转型时,虽然使用基类的
3、指针或者引用,但是调用的函数却是派生类重写的函数11.2虚函数611.2.1一般虚函数成员例11-1虚函数11.2虚函数classBase1{public:virtualvoidShow(){cout<<"Base1::Show()"<4、l;}//公共函数Show};711.2.1一般虚函数成员voidCallShow(Base1*pb1){//全局函数,参数为Base1的指针pb1->Show();}intmain(){Base1b1;Base2b2;Cc;//定义Base1、Base2、C的对象Base1*pb1;//定义Base1的指针pb1=&b1;//Base1类指针指向Base1类对象CallShow(pb1);pb1=&b2;//Base1类指针指向Base2类对象CallShow(pb1);pb1=&c;//Base1类指针指向C类对象CallShow(pb1);}15、1.2虚函数811.2.1一般虚函数成员例11-1虚函数运行结果分析这个结果和例10-7的输出结果很不一样。Base1声明Show为基函数,派生类Base2,C重写了该函数,通过向上转型,分别传递Base1,Base2,C的指针给CallShow函数时,虽然在CallShow函数中的语句是“pb1->Show();”,其中pb1被声明为Base1的指针,但是调用的函数确分别是Base1,Base2,C的Show函数11.2虚函数Base1::Show()Base2::Show()C::Show()911.2.1一般虚函数成员系统根据以下规则来判断派生6、类的一个函数成员是不是虚函数函数的名称与基类的虚函数名称是否相同;函数的参数个数、参数类型与基类的虚函数是否相同;函数的返回值与基类的虚函数的返回值是否相同,或者是满足向上转型的指针、引用的返回值如果从名称、参数、返回值三个方面检查之后,派生类都满足条件,则会自动确定为虚函数。此时,派生类的虚函数覆盖了基类的虚函数。而且派生类中的虚函数还会隐藏基类中同名函数的所有其他重载形式11.2虚函数1011.2.1一般虚函数成员例11-2虚函数对基类中同名函数的其他重载形式的隐藏11.2虚函数classBase1{public:virtualvoidShow(7、){cout<<“Base1::Show()”<Show();//调用Base1的虚函数pb1->Show(0);//调用Base1的非虚函数}1111.2.1一般虚函数成员例11-2虚函数8、对基类中同名函数的其他重载形式的隐藏11.2虚函数intmain(){Base1b1;Base2b2;//定
4、l;}//公共函数Show};711.2.1一般虚函数成员voidCallShow(Base1*pb1){//全局函数,参数为Base1的指针pb1->Show();}intmain(){Base1b1;Base2b2;Cc;//定义Base1、Base2、C的对象Base1*pb1;//定义Base1的指针pb1=&b1;//Base1类指针指向Base1类对象CallShow(pb1);pb1=&b2;//Base1类指针指向Base2类对象CallShow(pb1);pb1=&c;//Base1类指针指向C类对象CallShow(pb1);}1
5、1.2虚函数811.2.1一般虚函数成员例11-1虚函数运行结果分析这个结果和例10-7的输出结果很不一样。Base1声明Show为基函数,派生类Base2,C重写了该函数,通过向上转型,分别传递Base1,Base2,C的指针给CallShow函数时,虽然在CallShow函数中的语句是“pb1->Show();”,其中pb1被声明为Base1的指针,但是调用的函数确分别是Base1,Base2,C的Show函数11.2虚函数Base1::Show()Base2::Show()C::Show()911.2.1一般虚函数成员系统根据以下规则来判断派生
6、类的一个函数成员是不是虚函数函数的名称与基类的虚函数名称是否相同;函数的参数个数、参数类型与基类的虚函数是否相同;函数的返回值与基类的虚函数的返回值是否相同,或者是满足向上转型的指针、引用的返回值如果从名称、参数、返回值三个方面检查之后,派生类都满足条件,则会自动确定为虚函数。此时,派生类的虚函数覆盖了基类的虚函数。而且派生类中的虚函数还会隐藏基类中同名函数的所有其他重载形式11.2虚函数1011.2.1一般虚函数成员例11-2虚函数对基类中同名函数的其他重载形式的隐藏11.2虚函数classBase1{public:virtualvoidShow(
7、){cout<<“Base1::Show()”<Show();//调用Base1的虚函数pb1->Show(0);//调用Base1的非虚函数}1111.2.1一般虚函数成员例11-2虚函数
8、对基类中同名函数的其他重载形式的隐藏11.2虚函数intmain(){Base1b1;Base2b2;//定
此文档下载收益归作者所有