C++程序设计基础:第9章 虚函数与多态性_第1页
C++程序设计基础:第9章 虚函数与多态性_第2页
C++程序设计基础:第9章 虚函数与多态性_第3页
C++程序设计基础:第9章 虚函数与多态性_第4页
C++程序设计基础:第9章 虚函数与多态性_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

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

文档简介

1、华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012 多态性(多态性(PolymorphismPolymorphism)是指一个名字,多种语义;或界面)是指一个名字,多种语义;或界面 相同,多种实现。相同,多种实现。 重载函数是多态性的一种简单形式。重载函数是多态性的一种简单形式。 虚函数允许函数调用与函数体的联系在运行时才进行,称为虚函数允许函数调用与函数体的联系在运行时才进行,称为 动态联编。动态联编。第第9 9章章 虚虚函数与多态性函数与多态性华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 20012200129.1 静态联编静态联编9.2 类指针

2、的关系类指针的关系9.3 虚函数与动态联编虚函数与动态联编9.4 纯虚函数与抽象类纯虚函数与抽象类9.5 虚函数和多态性的应用虚函数和多态性的应用小结小结第第9 9章章 虚函数与多态性虚函数与多态性华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012 联编是指一个程序模块、代码之间互相关联的过程。联编是指一个程序模块、代码之间互相关联的过程。 静态联编,是程序的匹配、连接在编译阶段实现,也称为早期匹配。静态联编,是程序的匹配、连接在编译阶段实现,也称为早期匹配。 重载函数使用静态联编。重载函数使用静态联编。 动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编。

3、动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编。 switch 语句和语句和 if 语句是动态联编的例子。语句是动态联编的例子。9.1 9.1 静态联编静态联编华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 20012200129.1 9.1 静态联编静态联编普通成员函数重载可表达为两种形式:普通成员函数重载可表达为两种形式:1. 在一个类说明中重载在一个类说明中重载例如:例如:void Show ( int , char ) ;void Show ( char * , float ) ;华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 20012200129.

4、1 9.1 静态联编静态联编普通成员函数重载可表达为两种形式:普通成员函数重载可表达为两种形式:1. 在一个类说明中重载在一个类说明中重载例如:例如:void Show ( int , char ); 与与void Show ( char * , float ); 不是同一函数,编译能够区分不是同一函数,编译能够区分2. 基类的成员函数在派生类重载。有基类的成员函数在派生类重载。有 3 种编译区分方法:种编译区分方法:(1)根据参数的特征加以区分)根据参数的特征加以区分华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 20012200129.1 9.1 静态联编静态联编普通成员函数重

5、载可表达为两种形式:普通成员函数重载可表达为两种形式:1. 在一个类说明中重载在一个类说明中重载2. 基类的成员函数在派生类重载。有基类的成员函数在派生类重载。有 3 种编译区分方法:种编译区分方法:(1)根据参数的特征加以区分)根据参数的特征加以区分例如:例如:A : Show ( );有别于有别于B : Show ( );(2)使用)使用“ “ : ”加以区分加以区分华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 20012200129.1 9.1 静态联编静态联编普通成员函数重载可表达为两种形式:普通成员函数重载可表达为两种形式:1. 在一个类说明中重载在一个类说明中重载2.

6、 基类的成员函数在派生类重载。有基类的成员函数在派生类重载。有 3 种编译区分方法:种编译区分方法:(1)根据参数的特征加以区分)根据参数的特征加以区分(2)使用)使用“ “ : ”加以区分加以区分例如:例如:Aobj . Show ( )调用调用A : Show ( )Bobj . Show ( )调用调用B : Show ( )(3)根据类对象加以区分)根据类对象加以区分根据根据this指针类型区分指针类型区分华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012基类指针和派生类指针与

7、基类对象和派生类对象基类指针和派生类指针与基类对象和派生类对象4种可能匹配:种可能匹配: 直接用基类指针引用基类对象;直接用基类指针引用基类对象; 直接用派生类指针引用派生类对象;直接用派生类指针引用派生类对象; 用基类指针引用一个派生类对象;用基类指针引用一个派生类对象; 用派生类指针引用一个基类对象。用派生类指针引用一个基类对象。 9.2 类指针的关系华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012例如:例如:A * p ;/ 指向类型指向类型 A 的对象的指针的对象的指针A A_obj ;/ 类型类型 A 的对象的对象B B_obj ;/ 类型类型 B 的

8、对象的对象p = & A_obj ;/ p 指向类型指向类型 A 的对象的对象p = & B_obj ;/ p 指向类型指向类型 B 的对象,它是的对象,它是 A 的派生类的派生类 利用利用 p,可以通过,可以通过 B_obj 访问所有从访问所有从 A 类继承的元素类继承的元素 , 但不能用但不能用 p访问访问 B 类自定义类自定义的元素的元素 (除非用了显式类型转换)(除非用了显式类型转换)class Aclass B : public A9.2.1 9.2.1 基类指针引用派生类对象基类指针引用派生类对象9.2.1 基类指针引用派生类对象华南理工大学计算机学院华南理工大学计

9、算机学院 周霭如周霭如 2001220012#include#includeusing namespace std ;class A_class char name20 ; public : void put_name( char * s ) strcpy_s( name, s ) ; void show_name() cout name n ; ;class B_class : public A_class char phone_num 20 ; public : void put_phone( char * num ) strcpy_s ( phone_num , num ) ; void

10、 show_phone() cout phone_num put_name( Wang xiao hua ) ; A_p - show_name() ; A_p = & B_obj ; A_p - put_name( Chen ming ) ; A_p - show_name() ; B_obj.put_phone ( 5555_12345678 ); ( ( B_class * ) A_p ) - show_phone() ;例例9-1 9-1 使用基类指针引用派生类对象使用基类指针引用派生类对象 class A_classclass B_class : public A_class

11、9.2.1 基类指针引用派生类对象华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#include#includeusing namespace std ;class A_class char name20 ; public : void put_name( char * s ) strcpy_s( name, s ) ; void show_name() cout name n ; ;class B_class : public A_class char phone_num 20 ; public : void put_phone( char * num )

12、strcpy_s ( phone_num , num ) ; void show_phone() cout phone_num put_name( Wang xiao hua ) ; A_p - show_name() ; A_p = & B_obj ; A_p - put_name( Chen ming ) ; A_p - show_name() ; B_obj.put_phone ( 5555_12345678 ); ( ( B_class * ) A_p ) - show_phone() ;基类指针基类指针class A_classclass B_class : public A

13、_class9.2.1 基类指针引用派生类对象例例9-1 9-1 使用基类指针引用派生类对象使用基类指针引用派生类对象 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#include#includeusing namespace std ;class A_class char name20 ; public : void put_name( char * s ) strcpy_s( name, s ) ; void show_name() cout name n ; ;class B_class : public A_class char phone_num

14、20 ; public : void put_phone( char * num ) strcpy_s ( phone_num , num ) ; void show_phone() cout phone_num put_name( Wang xiao hua ) ; A_p - show_name() ; A_p = & B_obj ; A_p - put_name( Chen ming ) ; A_p - show_name() ; B_obj.put_phone ( 5555_12345678 ); ( ( B_class * ) A_p ) - show_phone() ;基类

15、指针基类指针指向基类对象指向基类对象class A_classclass B_class : public A_class9.2.1 基类指针引用派生类对象例例9-1 9-1 使用基类指针引用派生类对象使用基类指针引用派生类对象 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#include#includeusing namespace std ;class A_class char name20 ; public : void put_name( char * s ) strcpy_s( name, s ) ; void show_name() cout n

16、ame n ; ;class B_class : public A_class char phone_num 20 ; public : void put_phone( char * num ) strcpy_s ( phone_num , num ) ; void show_phone() cout phone_num put_name( Wang xiao hua ) ; A_p - show_name() ; A_p = & B_obj ; A_p - put_name( Chen ming ) ; A_p - show_name() ; B_obj.put_phone ( 55

17、55_12345678 ); ( ( B_class * ) A_p ) - show_phone() ;基类指针基类指针调用基类成员函数调用基类成员函数class A_classclass B_class : public A_class9.2.1 基类指针引用派生类对象例例9-1 9-1 使用基类指针引用派生类对象使用基类指针引用派生类对象 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#include#includeusing namespace std ;class A_class char name20 ; public : void put_nam

18、e( char * s ) strcpy_s( name, s ) ; void show_name() cout name n ; ;class B_class : public A_class char phone_num 20 ; public : void put_phone( char * num ) strcpy_s ( phone_num , num ) ; void show_phone() cout phone_num put_name( Wang xiao hua ) ; A_p - show_name() ; A_p = & B_obj ; A_p - put_n

19、ame( Chen ming ) ; A_p - show_name() ; B_obj.put_phone ( 5555_12345678 ); ( ( B_class * ) A_p ) - show_phone() ;class A_classclass B_class : public A_class基类指针基类指针指向派生类对象指向派生类对象9.2.1 基类指针引用派生类对象例例9-1 9-1 使用基类指针引用派生类对象使用基类指针引用派生类对象 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#include#includeusing namespa

20、ce std ;class A_class char name20 ; public : void put_name( char * s ) strcpy_s( name, s ) ; void show_name() cout name n ; ;class B_class : public A_class char phone_num 20 ; public : void put_phone( char * num ) strcpy_s ( phone_num , num ) ; void show_phone() cout phone_num put_name( Wang xiao hu

21、a ) ; A_p - show_name() ; A_p = & B_obj ; A_p - put_name( Chen ming ) ; A_p - show_name() ; B_obj.put_phone ( 5555_12345678 ); ( ( B_class * ) A_p ) - show_phone() ;class A_classclass B_class : public A_class调用调用从基类继承的成员函数从基类继承的成员函数9.2.1 基类指针引用派生类对象例例9-1 9-1 使用基类指针引用派生类对象使用基类指针引用派生类对象 华南理工大学计算机学

22、院华南理工大学计算机学院 周霭如周霭如 2001220012#include#includeusing namespace std ;class A_class char name20 ; public : void put_name( char * s ) strcpy_s( name, s ) ; void show_name() cout name n ; ;class B_class : public A_class char phone_num 20 ; public : void put_phone( char * num ) strcpy_s ( phone_num , num

23、) ; void show_phone() cout phone_num put_name( Wang xiao hua ) ; A_p - show_name() ; A_p = & B_obj ; A_p - put_name( Chen ming ) ; A_p - show_name() ; B_obj.put_phone ( 5555_12345678 ); ( ( B_class * ) A_p ) - show_phone() ;class A_classclass B_class : public A_class用派生类对象用派生类对象调用派生类的成员函数调用派生类的成

24、员函数9.2.1 基类指针引用派生类对象例例9-1 9-1 使用基类指针引用派生类对象使用基类指针引用派生类对象 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#include#includeusing namespace std ;class A_class char name20 ; public : void put_name( char * s ) strcpy_s( name, s ) ; void show_name() cout name n ; ;class B_class : public A_class char phone_num 20

25、; public : void put_phone( char * num ) strcpy_s ( phone_num , num ) ; void show_phone() cout phone_num put_name( Wang xiao hua ) ; A_p - show_name() ; A_p = & B_obj ; A_p - put_name( Chen ming ) ; A_p - show_name() ; B_obj.put_phone ( 5555_12345678 ); ( ( B_class * ) A_p ) - show_phone() ;class

26、 A_classclass B_class : public A_class对基类指针强类型转换对基类指针强类型转换调用派生类的成员函数调用派生类的成员函数9.2.1 基类指针引用派生类对象例例9-1 9-1 使用基类指针引用派生类对象使用基类指针引用派生类对象 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#include#includeusing namespace std ;class A_class char name20 ; public : void put_name( char * s ) strcpy_s( name, s ) ; void s

27、how_name() cout name n ; ;class B_class : public A_class char phone_num 20 ; public : void put_phone( char * num ) strcpy_s ( phone_num , num ) ; void show_phone() cout phone_num put_name( Wang xiao hua ) ; A_p - show_name() ; A_p = & B_obj ; A_p - put_name( Chen ming ) ; A_p - show_name() ; B_o

28、bj.put_phone ( 5555_12345678 ); ( ( B_class * ) A_p ) - show_phone() ;class A_classclass B_class : public A_class9.2.1 基类指针引用派生类对象例例9-1 9-1 使用基类指针引用派生类对象使用基类指针引用派生类对象 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012 派生类指针只有经过强制类型转换之后,才能派生类指针只有经过强制类型转换之后,才能引用基类对象引用基类对象 9.2.2 9.2.2 派生类指针引用基类对象派生类指针引用基类对象 9.2.

29、2 派生类指针引用基类对象华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Date public: Date( int y, int m, int d ) SetDate( y, m, d ); void SetDate( int y, int m, int d ) year = y ; month = m ; day = d ; void Print() cout year / month / day Print(); cout hours : minutes : seconds n ; p

30、rivate: int hours , minutes , seconds ; ;int main() DateTime dt( 2009, 1, 1, 12, 30, 0 ) ; dt.Print() ; 例例9-2 日期时间程序。在派生类中调用基类日期时间程序。在派生类中调用基类同名成员函数同名成员函数 9.2.2 派生类指针引用基类对象华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#include#includeclass Date public: Date( int y, int m, int d ) SetDate( y, m, d ); void

31、SetDate( int y, int m, int d ) year = y ; month = m ; day = d ; void Print() cout year / month / day Print(); cout hours : minutes : seconds Print();对对 this 指针作类型转换指针作类型转换调用基类成员函数调用基类成员函数 9.2.2 派生类指针引用基类对象例例9-2 日期时间程序。在派生类中调用基类日期时间程序。在派生类中调用基类同名成员函数同名成员函数 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#inc

32、ludeusing namespace std ;class Date public: Date( int y, int m, int d ) SetDate( y, m, d ); void SetDate( int y, int m, int d ) year = y ; month = m ; day = d ; void Print() cout year / month / day Print(); cout hours : minutes : seconds Print();9.2.2 派生类指针引用基类对象例例9-2 日期时间程序。在派生类中调用基类日期时间程序。在派生类中调用基

33、类同名成员函数同名成员函数 对对 this 指针作类型转换指针作类型转换调用基类成员函数调用基类成员函数 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Date public: Date( int y, int m, int d ) SetDate( y, m, d ); void SetDate( int y, int m, int d ) year = y ; month = m ; day = d ; void Print() cout year / month / day ; ; p

34、rotected : int year , month , day ; ;class DateTime : public Date public : DateTime( int y, int m, int d, int h, int mi, int s ) : Date( y, m, d ) SetTime( h, mi, s ); void SetTime( int h, int mi, int s ) hours = h; minutes = mi; seconds = s; void Print() cout hours : minutes : seconds n ; private:

35、int hours , minutes , seconds ; ;int main() DateTime dt( 2009, 1, 1, 12, 30, 0 ) ; dt.Print() ; 9.2.2 派生类指针引用基类对象例例9-2 日期时间程序。在派生类中调用基类日期时间程序。在派生类中调用基类同名成员函数同名成员函数 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012 冠以关键字冠以关键字 virtual 的成员函数称为虚函数的成员函数称为虚函数 实现运行时多态的关键首先是要说

36、明虚函数,另外,必须用实现运行时多态的关键首先是要说明虚函数,另外,必须用 基类指针调用派生类的不同实现版本基类指针调用派生类的不同实现版本9.3 9.3 虚函数和动态联编虚函数和动态联编 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012 基类指针虽然获取派生类对象地址,却只能访问派生类从基基类指针虽然获取派生类对象地址,却只能访问派生类从基类继承的成员类继承的成员9.3.1 9.3.1 虚函数和基类指针虚函数和基类指针9.3.1 虚函数和基类指针华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing name

37、space std ;class Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ; ;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: ; ;class Second_d : public First_d public : Second_d( char xx

38、, 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() ;例例9-3 9-3 演示基类指针的移动演示基类指针的移动 9.3.1 虚函数和基类指针华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeus

39、ing namespace std ;class Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ; ;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: ; ;class Second_d : public First_d public : Second_d(

40、 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() ;ATOENDxyzB_objF_objS_obj9.3.1 虚函数和基类指针例例9-3 9-3 演示基类指针的移动演示基类指针的移动 华南理工大学计算机学院华南理工大学计

41、算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ; ;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: ; ;class Second_d : p

42、ublic 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() ;ATOENDxyzB_objF_objS_objp定义基类指针定义基类指针9.3.1 虚函数和基类指针例例

43、9-3 9-3 演示基类指针的移动演示基类指针的移动 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived clas

44、s: x , y n ; protected: ; ;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() ;ATOENDxy

45、zB_objF_objS_objp9.3.1 虚函数和基类指针例例9-3 9-3 演示基类指针的移动演示基类指针的移动 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ; ;class First_d : public Base public : First_d(char xx, char yy):Base(xx) y = yy; v

46、oid who() cout First derived class: x , y n ; protected: ; ;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() ; ( ( S

47、econd_d * ) p ) - who() ;TOENDxyzB_objF_objS_objp9.3.1 虚函数和基类指针例例9-3 9-3 演示基类指针的移动演示基类指针的移动 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ; ;class First_d : public Base public : First_d(char

48、 xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: ; ;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 ;

49、 p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;ATOENDxyzB_objF_objS_objp9.3.1 虚函数和基类指针例例9-3 9-3 演示基类指针的移动演示基类指针的移动 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ; ;class First_d :

50、public Base public : First_d(char xx, char yy):Base(xx) y = yy; void who() cout First derived class: x , y n ; protected: ; ;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_o

51、bj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;AOENDxyzB_objF_objS_objp9.3.1 虚函数和基类指针例例9-3 9-3 演示基类指针的移动演示基类指针的移动 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Base public : Base(char xx) x = xx; void who() cout Base class: x n

52、; protected: ; ;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: ; ;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

53、: x , y , z who() ; p = &F_obj ; p - who() ; p = &S_obj ; p - who() ; F_obj.who() ; ( ( Second_d * ) p ) - who() ;AOENDxyzB_objF_objS_objp9.3.1 虚函数和基类指针例例9-3 9-3 演示基类指针的移动演示基类指针的移动 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Base public : Base(char xx) x = xx;

54、void who() cout Base class: x n ; protected: ; ;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: ; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz; void

55、 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() ;ATOENDxyzB_objF_objS_objp9.3.1 虚函数和基类指针例例9-3 9-3 演示基类指针的移动演示基类指针的移动 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Bas

56、e public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ; ;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: ; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz )

57、 : 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() ;ATONDxyzB_objF_objS_objp9.3.1 虚函数和基类指针例例9-3 9-3 演示基类指针的移动演示基类指针的移动 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#inclu

58、deusing namespace std ;class Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ; ;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: ; ;class Second_d : public First_d public : Secon

59、d_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() ;ATOENDxyzB_objF_objS_objpvoid who() cout First derived class: x , y n ; 9.3.1 虚函数

60、和基类指针例例9-3 9-3 演示基类指针的移动演示基类指针的移动 华南理工大学计算机学院华南理工大学计算机学院 周霭如周霭如 2001220012#includeusing namespace std ;class Base public : Base(char xx) x = xx; void who() cout Base class: x n ; protected: ; ;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: ; ;class Second_d : public First_d public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) z = zz;

温馨提示

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

最新文档

评论

0/150

提交评论