C++面向对象程序设计 教学课件 ppt 作者 朱战立 张玉祥 C++5

上传人:E**** 文档编号:89343499 上传时间:2019-05-23 格式:PPT 页数:40 大小:208.50KB
返回 下载 相关 举报
C++面向对象程序设计 教学课件 ppt 作者  朱战立 张玉祥 C++5_第1页
第1页 / 共40页
C++面向对象程序设计 教学课件 ppt 作者  朱战立 张玉祥 C++5_第2页
第2页 / 共40页
C++面向对象程序设计 教学课件 ppt 作者  朱战立 张玉祥 C++5_第3页
第3页 / 共40页
C++面向对象程序设计 教学课件 ppt 作者  朱战立 张玉祥 C++5_第4页
第4页 / 共40页
C++面向对象程序设计 教学课件 ppt 作者  朱战立 张玉祥 C++5_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《C++面向对象程序设计 教学课件 ppt 作者 朱战立 张玉祥 C++5》由会员分享,可在线阅读,更多相关《C++面向对象程序设计 教学课件 ppt 作者 朱战立 张玉祥 C++5(40页珍藏版)》请在金锄头文库上搜索。

1、第五章 继承,概念 派生类的声明及构造函数设计 不同继承方式的权限及二义性问题解决,继承性,定义 一个新的类拥有全部被继承类的成员变量和成员函数(不包括构造函数和析构函数) 基类(父类) 派生类(子类) 引入原因 程序功能扩充 模块重用,基类,派生类,派生类与基类的关系,基类是所有派生类共有属性和服务的抽取 派生类是基类的具体化 要设计的许多类都有相似的服务(如屏幕显示),但这些服务的代码设计没有共同性。这时我们可以定义基类中是抽象的、没有具体代码的虚函数。产生派生类时,将再次重载这些在基类中已定义的虚函数,并具体定义这些函数的功能。 有些派生类与基类的关系会是上述两种关系的合成。,派生类定义

2、,单重继承派生类定义 class:public/private/protected ;,派生类定义,多重继承派生类定义 class:继承方式1,继承方式2, ,继承方式n ;,三种继承方式访问权限关系,例5.1 public、private继承方式,#include class A private: int a1; protected: int a2; public: int a3; A(int x1, int x2, int x3): a1(x1), a2(x2), a3(x3) A(void) ;,class B: public A private: int b1; protected:

3、int b2; public: int b3; B(int x1, int x2, int x3, int y1, int y2, int y3): A(x1, x2, x3), b1(y1), b2(y2), b3(y3) B(void) void Print(void)const; ;,派生类构造函数,显式调用基类构造函数,为基类子对象赋值,void B:Print(void)const / cout “a1 = “ a1 endl; cout “a2 = “ a2 endl; cout “a3 = “ a3 endl; cout “b1 = “ b1 endl; cout “b2 = “

4、 b2 endl; cout “b3 = “ b3 endl; void Show(B ,void main(void) B MyB(1,2,3,4,5,6); MyB.Print(); Show(MyB); ,赋值兼容规则,前提:派生类公有继承基类 规则1:可以用派生类对象为基类对象赋值; 规则2:可以用派生类对象初始化基类引用对象; 规则3:可以把指向派生类对象的指针赋给基类对象的指针; 规则4:可以把派生类对象的地址赋给基类对象的指针。,例5.3 赋值兼容规则示例,class A protected: int a1; float a2; public: A(int x1 = 0, flo

5、at x2 = 0): a1(x1), a2(x2) A(A ,class B: public A private: int b1; float b2; public: B(int x1 = 0, float x2 = 0, int y1 = 0, float y2 = 0): A(x1, x2), b1(y1), b2(y2) B(B ,B myB2(2,3,4,5); A ,派生类对基类成员函数的覆盖,修改继承就是在派生类中重新设计基类中的成员函数,并且在原来的基础上做一些补充或修改,class A public: f() ;,class B: public A public: f() A

6、:f() ;,覆盖: 首先调用基类该成员函数,然后执行其余实现修改和补充任务的代码。,派生类对基类函数的覆盖,覆盖继承就是在派生类中完全重新设计基类中的成员函数,class A public: f() ,class B: public A public: f() ,B b; b.f(); C+沿类层次的当前层逐层向上匹配,问题:完全继承怎样设计?,多重继承的二义性问题,成员变量的二义性 产生原因:存在公共基类( 被两次或两次以上说明为某个派生类间接基类的类) 。 解决:加类名作用域( B1:和B2:)和虚基类,例5.4 成员变量二义性,#include class A protected: i

7、nt a; public: A(int aa): a(aa) A(void) ; class B1: public A protected: int b1;,public: B1(int aa, int bb1): A(aa), b1(bb1) B1(void) ; class B2: public A protected: int b2; public: B1(int aa, int bb1): A(aa), b1(bb1) B1(void) ;,class C: public B1, public B2 protected: int c; public: C(int aa1, int aa

8、2, int bb1, int bb2, int cc): B1(aa1, bb1), B2(aa2, bb2),c(cc) C(void) void PrintA(void)const /cout “a = “ a endl; cout “B1:a = “ B1:aendl; cout “B2:a = “ B2:a endl; ; void main(void) C myC(1,2,3,4,5); myC.PrintA(); ,多重继承的二义性问题,成员函数的二义性 产生原因:处于相同类层次级别上的同名成员函数。 解决:加类名作用域限定符(B1:和B2:),例5.5 成员函数二义性,#inc

9、lude class B1 protected: int b1; public: B1(int bb1):b1(bb1) B1(void) void Print(void)const cout b1 endl; ;,class B2 protected: int b2; public: B2(int bb2): b2(bb2) B2(void) void Print(void)const cout b2 endl; ;,class C: public B1, public B2 protected: int c; public: C(int bb1, int bb2, int cc): B1(

10、bb1), B2(bb2), c(cc) C(void) ; void main(void) C myC(1,2,3); / myC.Print(); /存在二义性,编译时出错 cout “B1:Print() = “; myC.B1:Print(); /加类名分辨符B1: cout “B2:Print() = “; myC.B2:Print(); /加类名分辨符B2: ,虚基类成员变量二义性解决方法,引入原因:不希望存在数据成员的二义性,即在派生类的对象中存在多个公共基类的同名数据成员(或称公共基类子对象) 设计方法: 当一个基类有多于一个派生类时,这些派生类在继承方式前加上virtual关

11、键字,具体格式为: class 派生类名: virtual publicprivateprotected 基类名 虚基类的子对象必须由最新派生出来的派生类直接初始化,虚基类,class B1: virtual public A class B2: virtual public A,C(int aa, int bb1, int bb2, int cc): B1(aa, bb1), B2(aa, bb2),A(aa), c(cc),例5.6 虚基类,class B1: virtual public A protected: int b1; public: B1(int aa, int bb1):

12、A(aa), b1(bb1) B1(void) ; class B2: virtual public A protected: int b2; public:,B2(int aa, int bb2): A(aa), b2(bb2) B2(void) ; class C: public B1, public B2 protected: int c; public: C(int aa, int bb1, int bb2, int cc): B1(aa, bb1), B2(aa, bb2),A(aa),c(cc) C(void) void PrintA(void)const cout “a = “

13、a endl; ; void main(void) C myC(1,2,3,4); myC.PrintA(); ,设计举例图书馆信息(公有继承),设计要求: 图书、杂志借阅系统 设计分析,资料 名字 条码 ,杂志 卷号,图书 作者 内部分类号 ,读者 姓名 借书证号 所借图书 已借图书数目,/Retrieval.h #include class Retrieval protected: char Title40; long Code; public: Retrieval(); Retrieval(char *title,long code); long GetCode()return Code

14、; void Show(); ; Retrieval:Retrieval() strcpy(Title,” “); Code=0; ,Retrieval:Retrieval(char *title, long code) strcpy(Title,title); Code=code; Void Retrieval:Show() cout“资料:”Titlet Codeendl; class Book:public Retrieval private: char Author20; char IndexCode10; public: Book(); Book(char *author,char

15、*title, char *index,long code); void Show(); ;,Book:Book():Retrieval() strcpy(Author,” “); strcpy(IndexCode,” “); Book:Book(char *author, char *title, char *index, long code): Retrival(title,code) strcpy(Author,author); strcpy(IndexCode,index); Void Book:Show() cout“图书:”tAuthortIndexCodetCodeendl; ,class Magazine :public Retrieval private: int Volume; public: Magazine(); Magazine (char *title, int vol , long

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

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