C++程序设计第8章13

上传人:飞*** 文档编号:48602534 上传时间:2018-07-18 格式:PPT 页数:54 大小:554KB
返回 下载 相关 举报
C++程序设计第8章13_第1页
第1页 / 共54页
C++程序设计第8章13_第2页
第2页 / 共54页
C++程序设计第8章13_第3页
第3页 / 共54页
C++程序设计第8章13_第4页
第4页 / 共54页
C++程序设计第8章13_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《C++程序设计第8章13》由会员分享,可在线阅读,更多相关《C++程序设计第8章13(54页珍藏版)》请在金锄头文库上搜索。

1、习题:P307 习题8.6 几何图形的派生关系本周实验内容:1. 习题调试上传2. MFC作业设计第8章类的继承与派生 (1)理解继承的概念,了解面向对象设计中继承和多态的合理性; (2)掌握派生类的构造与析构; (3)掌握在对象中使用类层次和继承思想进行设计、实现和测试; (4)理解多重继承,了解虚基类; (5)区别运行时的多态性的实现,理解重载与同名覆盖的差异; (6)理解虚函数与多态性。 (7)实现运行时多态性的程序设计;注:本章8.6.3,8.6.4节不要求class Date int Year,Month,Day; /分别存放年、月、日 public: Date(int y=0, i

2、nt m=0,int d=0); void SetDate(int ,int ,int ); / 完成数据成员的赋初值void GetDate(char *); / 将日期(整数)转换成“年/月/日” 形式的字符串后,存放到参数所指向的字符串中 ;class Time int Hours,Minutes,Seconds;/时、分、秒 public: Time(int h=0,int m=0, int s=0); void SetTime(int h,int m, int s); / 完成数据成员的赋初值void GetTime(char *); / 将时间(整数)转换成“时:分:秒”形式的字符

3、串,存/放到参数所指向的字符串中;class DateTime:public Date,public Time/公有派生 public: DateTime(); DateTime(int y,int m,int d,int h,int min,int s); void GetDateTime(char *); void SetDateTime(int y,int m,int d,int h,int min,int s); ; int main() 结果在此输出 输出结果为:实验日期为:2013/5/9实验时间为:9:30:50实验日期和实验时间分别是:2013/5/9; 9:30:50实验日期

4、和实验时间分别是:2013/5/9; 11:15:10把一个整数变换成字符串可通过库函数:#includechar * itoa(int a , char *s, int b);参数a为要变换的整数,b为数制的基数(如10, 表示将a转换为对应的十进制的字符串),转换的结果 存放到s所指向的字符串中。函数返回变换后字符串的 首指针。例:itoa(Year,s,10);/将年变换为字符串表示itoa(Month,t,10);/将月变换为字符串表示Date: Date(int y=0, int m=0,int d=0) Year= y; Month = m; Day = d; void Date:

5、SetDate(int y,int m,int d ) Year= y; Month = m; Day = d; void Date:GetDate(char *s) char t20; itoa(Year,s,10); strcat(s,“/“); itoa(Month,t,10); strcat(s,t); strcat(s,“/“); itoa(Day,t,10); strcat(s,t); Time:Time(int h=0,int m=0, int s=0) Hours = h; Minutes = m; Seconds = s; void Time: SetTime(int h,i

6、nt m, int s) Hours = h; Minutes = m;Seconds = s; void Time:GetTime(char *s) char t20; itoa(Hours,s,10); strcat(s,“:“); itoa(Minutes,t,10); strcat(s,t); strcat(s,“:“);itoa(Seconds,t,10); strcat(s,t); DateTime :DateTime():Date(),Time() DateTime : DateTime(int y,int m,int d,int h,int min,int s):Date(y,

7、m,d),Time(h,min,s)void DateTime:GetDateTime(char *s) char s1100,s2100; GetDate(s1); GetTime(s2); strcpy(s,“实验日期和实验时间分别是:“);strcat(s,s1); strcat(s,“; “);strcat(s,s2); void DateTime:SetDateTime(int y,int m,int d,int h,int min,int s) SetDate(y,m,d); SetTime(h,min,s); int main(void ) Date d1(2013,5,9);

8、char s200; d1.GetDate(s); coutname;while(strcmp(name,“O“)!=0) head=Statistic(head,name); coutname;coutname,name); head-count=1; head-next=0; elsewhile(p1)if( strcmp(p1-name,name)=0 )p1-count+;break;else p2=p1;p1=p1-next ;/while循环结束if( p1=NULL ) p1=new Node; strcpy(p1-name,name); p1-count=1; p1-next=

9、0; p2-next=p1;/p2-next=p1 /else结束return head ; void List(Node *head) /输出结果Node *p=head ; while(p) coutnamecountnext ; void Free(Node *head) /释放链表空间 Node *p;while(head)p=head;head=head-next;delete p; 类B 是类A的派生类x A()x A( ) y B( )x A( ) z C( )A类B类C类dx D()x A() z C()y B()A()xD类类A拷贝 类C 是类A的派生类类D 是类B和类C的派

10、生类这样,类D中就有两份类A的拷贝B类C类类A拷贝虚基类(virtual base class)这种同一个公共的基类在派生类中产生多个拷贝,不仅多占用了存储空间,而且可能会造成多个拷贝中的数据不一致 和模糊的引用。D d;d.x=10; /模糊引用dx D()x A() z C()y B()A()xD类类A拷贝B类C类类A拷贝使用虚基类使得公共基类在它的派生类对象中只公共基类在它的派生类对象中只 产生一个基类对象产生一个基类对象 。虚基类的定义格式如下: class 派生类名:virtual 访问控制符 基类类名.; class 派生类名:访问控制符 virtual 基类类名.;virtual

11、 关键字只对紧随其后的基类名起作用:class B:public virtual Apublic:int y;B(int a=0, int b=0 ):A(b) y=a;x A()x A( ) y B( )x A( ) z C( )A类B类C类x A() y B() z C() dx D()D类一份拷贝,在D( )的构造函数中直 接调用A()由虚基类派生出的对象初始化时,直接调用虚基类的构造函数。因此,若将一个类定义为虚基类,则一定有正确的构造函数可供所有派生类调用。再次强调,用虚基类进行多重派生时,若虚基类没有缺省的构造函数,则在每一个派生类的构造函数中都必须有对虚基类构造函数的调用 (且首

12、先调用)。 赋值兼容规则基类 对象派生类 对象相互之间能否赋值?可以将派生类对象的值赋给基类对象。反之不行Base b;Derive d;b = d;只是给从基类继承来的成员赋值。20可以将一个派生类对象的地址赋给基类的指针变量。基类对象派生类对象Base b;Derive d;Base *basep;basepbasep=basepbasep = Base 基类对象派生类对象Base b;Derive d;别名bb只能引用从基类继承来的成员。基类引用派生类对象 赋值兼容规则 公有派生类对象可以赋值给其基类的对象,反 之不行; 派生类的对象可以初始化基类的引用; 派生类对象的地址可以赋给基类型

13、的指针。8.6 多态性与虚函数 多态性是面向对象程序设计的关键技术之一。指的是 调用同样的函数实现不同的功能。在C+ 中有两 种多态编译时的 多态性 (静态多态性)运行时的 多态性 在程序执行前无法确定调用哪一 个函数,必须在程序执行过程中 ,根据执行的具体情况来动态地 确定。通过类继承关系和虚函数 来实现的。目的:建立一种通用 的程序。通过函数的重载和运 算符的重载实现。多态性是“一个接口,多种方法”:通过继承产生了相关的不同的派生类,和基类成员同 名的成员在不同的派生类中有不同的含义。虚函数的作用:允许在派生类中重新定义与基类同名的函数,并且 可以通过基类指针或引用来访问基类和派生类中的同

14、名 函数。 虚函数是一个类的成员函数,定义虚函数的格式如下:virtual 返回类型 函数名(参数表); 注:virtual仅用于类定义中,若虚函数在类外定义,不能加virtual(类中函数说明要加virtual )。 当某一个类的一个类成员函数被定义为虚函数,则由 该类派生出来的所有派生类中,该函数始终保持虚函数的 特征。 8.6.1 虚函数的定义在派生类中重新定义虚函数(称超载或覆盖)时,不必再加关键 字virtual,但函数头一定要完全相同。虚函数的使用: (1) 在基类用virtual声明成员函数为虚函数。 (2) 在派生类中重新定义此函数,要求函数名、函数类型、 函数参数个数和类型全

15、部与基类的虚函数相同,并根据 派生类的需要重新定义函数体。(3) 定义一个指向基类对象的指针变量,并使它指向同一 类族中需要调用该函数的对象。(4) 通过该指针变量调用此虚函数,此时调用的就是指针 变量指向的对象的同名函数。例:class A public: virtual void show(); ; void A:show() coutshow(); /动态调用 p= p-show(); /动态调用p= p-show(); /动态调用 运行结果:A:show()B:show()C:show()int main() C c; c.A:show(); /静态调用 c.B:show(); /静态调用c.show(); /静态调用 【例8.6】计算学分。由本科生类派生出研究生类GradeStudent,但它们各自 的从课程学时数折算为学分数的算法是不同的,本科生是16个学时 一学分,而研究生是20个学时一学分。 class Student char coursename20;/课程名

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号