继承多态信息工程学院计算机技术教研室_第1页
继承多态信息工程学院计算机技术教研室_第2页
继承多态信息工程学院计算机技术教研室_第3页
继承多态信息工程学院计算机技术教研室_第4页
继承多态信息工程学院计算机技术教研室_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、概述 多态性(Polymorphism)是指一个名字,多种语义;或界面 相同,多种实现。即当发出同样的消息被不同类型的对象接 收时,导致完全不同的行为。 多态性是面向对象程序设计的重要特征之一。 多态的实现:函数重载运算符重载虚函数联编是指一个程序模块、代码之间互相关联的过程。 静态联编(Static Binding):是指程序的匹配、连接在编译阶段,即程序运行之前完成,也称为早期匹配。重载函数使用静态联编。 动态联编(Dynamic Binding) :是指程序联编推迟到运行时进行,所以又称为晚期联编。继承和虚函数使用的是动态联编。8.6 联编(Binding)普通成员函数重载可表达为两种形

2、式:1. 在一个类说明中重载例如:Show ( int , char ) ;Show ( char * , float ) ;8.7 静态联编普通成员函数重载可表达为两种形式:1. 在一个类说明中重载例如:Show ( int , char ); 与Show ( char * , float ); 不是同一函数,编译能够区分2. 基类的成员函数在派生类重载。有 3 种编译区分方法:(1)根据参数的特征加以区分8.7 静态联编普通成员函数重载可表达为两种形式:1. 在一个类说明中重载2. 基类的成员函数在派生类重载。有 3 种编译区分方法:(1)根据参数的特征加以区分例如:A : Show (

3、);有别于B : Show ( );(2)使用“ : ”加以区分8.7 静态联编普通成员函数重载可表达为两种形式:1. 在一个类说明中重载2. 基类的成员函数在派生类重载。有 3 种编译区分方法:(1)根据参数的特征加以区分(2)使用“ : ”加以区分例如:Aobj . Show ( )调用A : Show ( )Bobj . Show ( )调用B : Show ( )(3)根据类对象加以区分8.7 静态联编 冠以关键字 virtual 的成员函数称为虚函数 实现运行时多态的关键首先是要说明虚函数,另外,必须 用基类指针调用派生类的不同实现版本8.8 虚函数和动态联编 基类指针虽然获取派生类

4、对象地址,却只能访问派生类从基类继承的成员8.8.1 虚函数和基类指针#includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d

5、 : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针#includeclass Base public : Base(

6、char xx) x = xx; void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : F

7、irst_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_obj#includeclass Base public : Base(char xx) x = xx; void who() cout Base class:

8、 x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Sec

9、ond derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp定义基类指针#includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: char x; ;class Firs

10、t_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ;

11、p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp#includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx,

12、 char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - w

13、ho() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp#includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout

14、First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) -

15、 who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp#includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: c

16、har y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_

17、objF_objS_objp#includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d pub

18、lic : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp#includeclass Base public : B

19、ase(char xx) x = xx; void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz )

20、 : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp#includeclass Base public : Base(char xx) x = xx; void who() cout Base c

21、lass: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cou

22、t Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp#includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: char x; ;class First

23、_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p

24、 = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objpvoid who() cout First derived class: x , y n ; #includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: char x; ;class F

25、irst_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who()

26、 ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objpvoid who() cout First derived class: x , y n ; 通过对象调用成员函数#includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ch

27、ar x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x

28、 , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objpvoid who() cout Second derived class: x , y , z n ; #includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; prot

29、ected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived

30、 class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objpvoid who() cout Second derived class: x , y , z n ; 基类指针做类型转换#includeclass Base public : Base(char xx) x = xx; void who() cout Base

31、 class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() c

32、out Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp通过基类指针只能访问从基类继承的成员 #includeclass Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected:

33、 char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class

34、: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp修改程序定义虚函数#includeclass Base public : Base(char xx) x = xx; virtual void who() cout Base class: x n ; protected: char x; ;class First_d :

35、public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F

36、_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针基类定义虚函数#includeclass Base public : Base(char xx) x = xx; virtual void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(x

37、x) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who

38、() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针派生类的重定义版本默认为虚函数#includeclass Base public : Base(char xx) x = xx; virtual void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived clas

39、s: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动

40、8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_obj#includeclass Base public : Base(char xx) x = xx; virtual void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;cla

41、ss Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_o

42、bjp#includeclass Base public : Base(char xx) x = xx; virtual void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public

43、 : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp#includeclass Base public : Base

44、(char xx) x = xx; virtual void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char

45、 zz ) : First_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp#includeclass Base public : Base(char xx) x = xx; virtual void who(

46、) cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; v

47、oid who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objpvoid who() cout First derived class: x , y n ; #includeclass Base public : Base(char xx) x = xx; virtu

48、al void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy

49、 ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objvoid who() cout First derived class: x , y n ; p#includeclass Base public : Base(char xx) x

50、 = xx; virtual void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : Fir

51、st_d( xx, yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp#includeclass Base public : Base(char xx) x = xx; virtual void who() cout Base

52、 class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void who() c

53、out Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objpvoid who() coutSecond derived class: x, y, zn ; #includeclass Base public : Base(char xx) x = xx; virtual void wh

54、o() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz;

55、 void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objvoid who() coutSecond derived class: x, y, zn ; p#includeclass Base public : Base(char xx) x = xx; vi

56、rtual void who() cout Base class: x n ; protected: char x; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: char y; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx,

57、 yy ) z = zz; void who() cout Second derived class: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;演示基类指针的移动 8.8.1 虚函数和基类指针ATOENDxyzB_objF_objS_objp由于who()的虚特性随着p指向不同对象,执行不同实现版本 注意: 一个虚函数,在派生类层界面相同的重载函数都保持虚特性 虚函数必须是类的成员函数,不能是全局函数和静态函数

58、不能将友元说明为虚函数,但虚函数可以是另一个类的友元 析构函数可以是虚函数,但构造函数不能是虚函数 动态联编只能通过指针或引用来操作虚函数,如果采用其他标识对象来操作虚函数,将采用静态联编方式调用虚函数。8.8.1 虚函数和基类指针 在派生类中重载基类的虚函数要求函数名、返回类型、参数 个数、参数类型和顺序完全相同 如果仅仅返回类型不同,C+认为是错误重载 如果函数原型不同,仅函数名相同,丢失虚特性 8.8.2 虚函数的重载特性void g ( ) derived d ; base * bp = & d ; / 基类指针指向派生类对象 bp - vf1 ( ) ; / 调用 derived :

59、 vf1 ( ) bp - vf2 ( ) ; / 调用 base : vf2 ( ) bp - f ( ) ; / 调用 base : f ( ) ; 例:class base public : virtual void vf1 ( ) ; virtual void vf2 ( ) ; virtual void vf3 ( ) ; void f ( ) ; ;class derived : public base public : void vf1 ( ) ;/ 虚函数 void vf2 ( int ) ;/ 重载,参数不同,虚特性丢失 char vf3 ( ) ;/ error,仅返回类型

60、不同 void f ( ) ;/ 非虚函数重载 ;8.8.2 虚函数的重载特性 构造函数不能是虚函数。建立一个派生类对象时,必须从类 层次的根开始,沿着继承路径逐个调用基类的构造函数 析构函数可以是虚的。虚析构函数用于指引 delete 运算符正 确析构动态对象 8.8.3 虚析构函数#includeclass A public: A() cout A:A() is called.n ; ;class B : public A public: B() cout B:B() is called.n ; ;void main() A *Ap = new B ; B *Bp2 = new B ; c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论