C++程序设计基础第12章-虚函数与多态性课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C++程序设计基础第12章-虚函数与多态性课件.pptx》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 基础 12 函数 多态性 课件
- 资源描述:
-
1、第第12章章 虚函数与多态性虚函数与多态性主讲:李政伟主讲:李政伟2第第12章章 虚函数与多态性虚函数与多态性12.1 多态性的概念多态性的概念12.2 虚函数的定义虚函数的定义12.3 抽象类抽象类12.4 实例研究实例研究3多态性多态性多态一词最初来源于希腊语多态一词最初来源于希腊语Polumorphos,含义是具,含义是具有多种形式或形态的情形。有多种形式或形态的情形。多态性多态性:发出同样的:发出同样的消息消息被不同类型的对象接收时会被不同类型的对象接收时会导致完全不同的行为。导致完全不同的行为。多态性多态性:父类型具有:父类型具有“引用由它派生的任何子类型引用由它派生的任何子类型”的
2、能力。的能力。 多态的实现途径多态的实现途径12.1 多态性多态性(polymorphism)的概念的概念静态多态静态多态动态多态动态多态4函数重载函数重载:在同一作用域内的多个函数采用相:在同一作用域内的多个函数采用相同名字,只要使用不同类型、不同数目的参数。同名字,只要使用不同类型、不同数目的参数。作为重载函数作为重载函数:(1)至少在参数个数、参数类型上有所不同。)至少在参数个数、参数类型上有所不同。(2)使用缺省函数参数要注意二义性。)使用缺省函数参数要注意二义性。如:如: void print(int a,int b); void print(int a,int b,int c=50
3、); print(10,100); 12.1 多态性多态性(polymorphism)的概念的概念512.1 多态性多态性(polymorphism)的概念的概念运算符重载运算符重载:对已有的运算符赋予多重含义。:对已有的运算符赋予多重含义。必要性必要性& C+中预定义运算符其运算对象只能是中预定义运算符其运算对象只能是标标准数据类型准数据类型,而不适用于,而不适用于用户自定义类型用户自定义类型(如类)。(如类)。实现机制实现机制& 将指定的运算表达式转化为对将指定的运算表达式转化为对运算符函数运算符函数的调用,运算对象转化为运算符函数的的调用,运算对象转化为运算符函数的实参实参。6分类分类系
4、统实现的角度系统实现的角度&静态多态性静态多态性:在:在编译时编译时系统就能决定调用系统就能决定调用哪个函数,又称哪个函数,又称编译时的多态性编译时的多态性。函数重载、运算符重载函数重载、运算符重载&动态多态性动态多态性:在:在运行过程中运行过程中才动态确定操才动态确定操作所针对的对象。又称作所针对的对象。又称运行时多态运行时多态。虚函数虚函数(virtual function)12.1 多态性多态性(polymorphism)的概念的概念7class Point public: Point(double i, double j) x=i; y=j; double Area() const r
5、eturn 0.0; private: double x, y;class Rectangle:public Point public:Rectangle(double i, double j, double k, double l);double Area() const return w*h; private:double w,h;例例12.1 非虚函数举例非虚函数举例8Rectangle:Rectangle(double i, double j, double k, double l) : Point(i,j) w=k; h=l; void fun(Point &Pref) coutAr
6、ea=Pref.Area()endl; void main()Rectangle rec(3.0, 6.0, 15.0, 20.0);fun(rec);例例12.1非虚函数举例非虚函数举例注意事项注意事项派生类对象指针使用时应注意的问题:派生类对象指针使用时应注意的问题:(1)声明为指向基类对象的指针可以指向它的公有派)声明为指向基类对象的指针可以指向它的公有派生类的对象,但不允许指向它的私有派生类的对象。生类的对象,但不允许指向它的私有派生类的对象。 (2)允许声明为指向基类对象的指针指向它的公有派)允许声明为指向基类对象的指针指向它的公有派生类的对象,但不允许将一个声明为指向派生类对象生类
7、的对象,但不允许将一个声明为指向派生类对象的指针指向基类的对象。的指针指向基类的对象。(3)声明为指向基类对象的指针,当其指向它的公有)声明为指向基类对象的指针,当其指向它的公有派生类的对象时,只能直接访问派生类中从基类继承派生类的对象时,只能直接访问派生类中从基类继承下来的成员,不能直接访问公有派生类中定义的成员。下来的成员,不能直接访问公有派生类中定义的成员。要想访问其公有派生类中的成员,可将基类指针用显要想访问其公有派生类中的成员,可将基类指针用显式类型转换方式转换为派生类指针。式类型转换方式转换为派生类指针。1012.3 虚函数虚函数12.3.1 虚函数的作用虚函数的作用同一类中同一类
8、中不能不能定义定义名字名字,参数个数参数个数和和类型类型都相都相同的函数,不能同的函数,不能“重复定义重复定义”。不同层次中不同层次中可以可以出现出现名字名字、参数个数参数个数和和类型类型都都相同而功能不同的函数。系统按照相同而功能不同的函数。系统按照同名覆盖同名覆盖的的原则决定调用对象。原则决定调用对象。rc1.area( ) /派生类派生类Rectangle的成员函数的成员函数。rc1.Point:area( ) /基类基类Point的成员函数的成员函数Pref.area( )11虚函数的声明形式虚函数的声明形式virtual () 函数体函数体 &成员成员函数,函数,非非static成员
9、函数成员函数&有继承性,基类中定义了虚函数,派生类中有继承性,基类中定义了虚函数,派生类中,同原型函数都自动为虚函数。,同原型函数都自动为虚函数。&作用作用:。12.3 虚函数虚函数12class Apublic:virtual void display() cout“A:display();class B: public A public: void display() /自动成为虚函数自动成为虚函数 cout“B:display(); ;class C: public B public: void display() /自动成为虚函数自动成为虚函数 cout“C:display()disp
10、lay(); void main() A a1, *p;B b1; C c1; p=&a1;fun(p); p=&b1;fun(p); p=&c1;fun(p); 13虚函数的使用方法虚函数的使用方法 (1) 基类中用基类中用virtual声明其为声明其为虚函数虚函数(2) 要求要求函数名函数名、返回类型返回类型、参数个数参数个数和和类类型型全部与基类的虚函数相同,根据需要重新全部与基类的虚函数相同,根据需要重新定义函数体。定义函数体。(3) 定义一个定义一个指向基类对象的指针变量指向基类对象的指针变量,使,使它指向同一类族中要调用该函数的对象。它指向同一类族中要调用该函数的对象。(4) 通过
11、该指针变量调用此虚函数通过该指针变量调用此虚函数,调用的是,调用的是指针变量指向的对象所属类的同名函数。指针变量指向的对象所属类的同名函数。例例12.2 基类与派生类中有同名函数基类与派生类中有同名函数14函数重载函数重载可用于普通函数和类的成员函数;可用于普通函数和类的成员函数;虚函数虚函数只能用于类的成员函数。只能用于类的成员函数。函数重载函数重载可用于构造函数;可用于构造函数;虚函数虚函数不可以。不可以。重载成员函数重载成员函数必须属于同一个类,为横向;必须属于同一个类,为横向;虚函数虚函数是同一类族中基类和派生类的是同一类族中基类和派生类的同同原型原型函数,为纵向。函数,为纵向。函数重
12、载函数重载要求函数名字相同,但参数个数或类型不要求函数名字相同,但参数个数或类型不同;同;虚函数虚函数要求同一类族所有虚函数的名字、参数要求同一类族所有虚函数的名字、参数类型、个数完全相同。类型、个数完全相同。函数重载函数重载在编译时确定;在编译时确定;虚函数虚函数在程序运行时确定。在程序运行时确定。函数重载函数重载 PK 虚函数虚函数12.2.3 虚函数的限制虚函数的限制使用虚函数时应注意如下问题:使用虚函数时应注意如下问题:(1)虚函数声明只能出现在类声明的函数原型的声明)虚函数声明只能出现在类声明的函数原型的声明中,不能出现在函数体实现中,同时基类中只有保护中,不能出现在函数体实现中,同
13、时基类中只有保护成员或公有成员才能被声明为虚函数。成员或公有成员才能被声明为虚函数。(2)派生类中重新定义虚函数时,关键字)派生类中重新定义虚函数时,关键字virtual可以写可以写也可不写,为避免引起混乱,应写上该关键字。也可不写,为避免引起混乱,应写上该关键字。(3)动态联编只能通过成员函数来调用或通过指针、)动态联编只能通过成员函数来调用或通过指针、引用来访问虚函数,如果用对象名的形式来访问虚函引用来访问虚函数,如果用对象名的形式来访问虚函数,将采用静态联编。数,将采用静态联编。(4)构造函数不能声明为虚函数,析构函数可以声明)构造函数不能声明为虚函数,析构函数可以声明为虚函数为虚函数例
展开阅读全文