C类别的继承(Cla).ppt

上传人:max****ui 文档编号:14146934 上传时间:2020-07-08 格式:PPT 页数:21 大小:353.81KB
收藏 版权申诉 举报 下载
C类别的继承(Cla).ppt_第1页
第1页 / 共21页
C类别的继承(Cla).ppt_第2页
第2页 / 共21页
C类别的继承(Cla).ppt_第3页
第3页 / 共21页
资源描述:

《C类别的继承(Cla).ppt》由会员分享,可在线阅读,更多相关《C类别的继承(Cla).ppt(21页珍藏版)》请在装配图网上搜索。

1、,物件導向的三大特性:資料封裝、複載(同名異式) 、繼承。 隨著時間與使用者環境的影響,舊定的類別資料型態將無法符合使用者的需求, 利用物件導向中繼承的特性可將舊有的類別加以擴充為目前所需的狀態,而不 必更動原來的data member及member function 。 繼承類別內的資料成員與成員函式具有重複使用的特性。 被繼承的類別稱為基礎類別(Base class)或父類別,而經由繼承關係所定義出之 類別為衍生類別(Derived class)或子類別 。 利用舊有的資料型態定義出新的資料型態,在這新的資料型態中不但有新的資 料成員及成員函式,同時也擁有舊資料型態的全部資料成員及成員函式

2、,就好像 真實世界中繼承者可以擁有被繼承者所留下的全部東西及使用方法。 類別繼承是從一基礎類別繼承其特性,包括資料和運作方式,變成一新類別。 程式師對繼承而來的新類別可作下列更動 從既存類別中加入新函數。例:繼承一個矩型類別並加入一新函數求其對角線 從既存類別中加入新資料。例如,繼承一 String 類別,並在類別中加入顏色資料 成員,使字串顯示時能包含顏色。 在新類別中修改既存類別之運作方式。 類別繼承不須取用原始程碼,因此,如果購買的類別庫只包含標題檔及類別的目的檔 我們仍可繼承到新類別繼續發展。,C+ 類別的繼承(Class Inheriance),繼承的寫法,繼承方式,class sh

3、ape protected: int x,y; /中心點 public: void draw() . s1; class circle: public shape private: int radius; public: void draw() c1; void main() ,Class employee private: char name20; unsigned long number; public: void getdata() cout name; cout number; void putdata() cout “n Name:” name; cout “n Number:” n

4、umber; ; class manager: private employee private: har title30; public: void getdata() void putdata() ; void main() ,Class Base private: int a; void func1() protected: int b; void func2() public: int c; void func3() ; void main() ,私有區data及function 僅供自己類別內存取,保護區data及function僅供 自己類別內及繼承之兒子存取,公用區data及fu

5、nction供 所有敘述及函數存取,void func1()a=2; void func2()a=3; func1(); void func3()a=3; func1();,void func2()b=2; void func3()a=3; func1();,void main() a=2; func1();,void main() b=2;,void func3()c=3; func1(); void main() base bs1; bs1.c=3; bs1.func3();,void main() base bs1; c=2; func3();,基礎類別中的保護等級,Class Base

6、 private: int a; void func1() protected: int b; void func2() public: int c; void func3() b1; class Drbase:public base private: int d; void func4() protected: int e; func5() public: int f; func6() ;,私有區data及function 僅供自己類別內存取,保護區data及function僅供 自己類別內及繼承之兒子存取,公用區data及function供 所有敘述及函數存取,以 public 方式繼承,

7、可分別繼承基礎類別protected 及 public區 之data member 及 member function 到自己 protected 及 public 區,繼承但無法直接取用: public: int a; int c; /繼程而得 void func1() int f; /原有 private: void func3() /繼程而得 int d; /原有 void func6() /原有 void func4() /原有 protected: int b; /繼程而得 int e; /原有 void func2() /繼程而得 void func59) /原有,繼承後的 Drb

8、ase類別,Class Base private: int a; void func1() protected: int b; void func2() public: int c; void func3() b1; class Drbase:private base private: int d; void func4() protected: int e; func5() public: int f; func6() ;,私有區data及function 僅供自己類別內存取,保護區data及function僅供 自己類別內及繼承之兒子存取,公用區data及function供 所有敘述及函數

9、存取,以 private 方式繼承,可繼承基礎類別protected 及 public區 之data member 及 member function 到自己 private 區,繼承但無法直接取用: protected: int a; int e; /原有 void func1() void func5(); /原有 private: public: int b;/繼承而得 int f; /原有 int c; /繼承而得 void func6() /原有 int d; /原有 void func2() /繼承而得 void func3() /繼承而得 void func4() /原有,繼承後

10、的 Drbase類別,繼,藉由繼承,衍生類別可擁有基儲類別的所有data member 及 member function 繼承方式為 public 或 private 兩種: 若繼承方式為 public方式,則衍生類別分別繼承基礎類別中 protected 區及 public 區的所有 data member 及 member function 到自己的 protected 及 public 區。 若繼承方式為 private方式,則衍生類別繼承基礎類別中 protected 區及 public 區的所有 data member 及 member function 到自己的 private

11、區。 以 public 繼承方式: 基礎類別的 public 資料成員變成衍生類別的public資料成員。 基礎類別的 protected 資料成員變成衍生類別的 protected資料成員。 基礎類別的 private 資料成員變成衍生類別的一部份,這部份唯有透過基礎 類別的protected 或public 成員函數才能取用。 以 private 繼承方式: 基礎類別的 public 資料成員變成衍生類別的private資料成員,僅衍生類別之 member function 可取用。 基礎類別的 protected 資料成員變成衍生類別的 private資料成員,僅衍生類別 之 membe

12、r function 可取用。 基礎類別的 private 資料成員變成衍生類別的一部份,這部份唯有透過基礎 類別的protected 或public 成員函數才能取用。,#include class Counter protected: unsigned int count; public: Counter() count=0; Counter(int c) count=c; int get_count() return count; Counter operator + () count+; return Counter(count); ; class CountDn:public Cou

13、nter public: Counter operator - () count-; return Counter(count); ;,繼承的基本觀念,void main() CountDn c1; cout nc1= c1.get_count(); c1+;c1+;c1+; cout nc1= c1.get_count(); c1-;c1-; cout nc1= c1.get_count(); ,Private:無 protected: unsigned int count; public: Counter() Counter(int c) int get_count(). Counter

14、operator + () Counter operator - () ,繼承後的 CountDn 類別,Ans: c1=0 c1=3 c1=1,#include class incount protected: int c1,c2; public: incount() c1=0; c2=1000; incount(int vc1,int vc2) c1=vc1; c2=vc2; void retcount() cout c1= c1; cout c2= c2 endl; incount operator + () c1+; c2+; return incount(c1,c2); ; clas

15、s dncount:public incount public: incount operator - () c1-; c2-; return incount(c1,c2); ;,繼承的基本觀念,void main() dncount dc1,dc2; dc1.retcount(); dc2.retcount(); dc1-; dc1.retcount(); dc2+; dc2.retcount(); ,Private:無 protected: int c1,c2; public: incount() incount(int vc1,int vc2) retcount() incount op

16、erator + () incount operator - () ,繼承後的 dncount 類別,Ans: c1=0 c2=1000 c1=0 c2=1000 c1=-1 c2=999 c1=1 c2=1001,#include class basescore private: int math; protected: int eng; public: int chem; class dbase1: public basescore public: void input() / cout math; error! cout eng; cout chem; ; / class dbase2:

17、 protected basescore class dbase3: private basescore public: void input() /cout math; cout eng; cout chem; ;,Private 與 Public 繼承關係,void main() dbase1 pub; pub.input(); dbase3 pri; pri.input(); int s,t; / s=pub.math; / s=pub.eng; s=pub.chem; / t=pri.math; / t=pri.eng; / t=pri.chem; ,無法操作: int math; P

18、rivate:無 protected: int eng; public: int chem; void input(),繼承後的 dbase1 類別,繼承後的 dbase3 類別,無法操作: int math; Private:無 protected: int eng; public: int chem; void input(),無法操作: int math; Private: int eng; int chem; protected:無 public: void input(),衍生類別的建構元函數定義,當建立一衍生類別的物件時,程式首先呼叫基本類別的建構元函數,然後才呼叫衍生類別的 建構

19、元函數。 當物件失效時,程式首先呼叫衍生類別的解建構函數,然後才呼叫基底類別的解建構函數。,#include class Base public: Base() cout in Bases constructorn; Base() cout in Bases destructorn; ; class DRBase:Base public: DRBase() cout in DRBases constructorn; DRBase() cout in DRBases destructorn; ; void main() Base b1,b2; DRBase dr1,dr2;,Output: in

20、 Bases constructor /construct b1 in Bases constructor /construct b2 in Bases constructor /construct dr1 in DRBases constructor /construct dr1 in Bases constructor /construct dr2 in DRBaases constructor /construct dr2 in DRBases destructor /destruct dr2 in Bases destructor /destruct dr2 in DRBases de

21、structor /destruct dr1 in Bases destructor /destruct dr1 in Bases destructor /destruct b2 in Bases destructor /destruct b2,#include #include class Base private: int a; public: Base() a=1; cout a= a endl; Base(int c) a=c; cout a= a endl; Base() cout in Bases destructorn; ;,class DRBase:Base private:

22、int b; public: DRBase() b=1; cout b= b endl; DRBase(int d) b=d; cout b= b endl; DRBase() cout in DRBases destructorn; ; void main() clrscr(); Base b1,b2(3); DRBase dr1,dr2(5); ,Output: a=1 a=3 a=1 b=1,a=1 b=5 in DRBases destructor in Bases destructor,in DRBases destructor in Bases destructor,in Base

23、s destructor in Bases destructor,衍生類別的建構元函數亦可呼叫基本類別的建構元函數。,class incount protected: int c1,c2; public: incount()c1=0; c2=1000; incount(int vc1, int vc2) c1=vc1; c2=vc2; class dncount : public incount public: dncount():incount() . dncount(int a,int b): incount(a,b) ,繼承於incount類別,呼叫 incount類別之另一建構子,並將

24、 本建構子的參數傳給基本類別的建構子,呼叫 incount類別之建構子,呼叫完 incount類別之建構子後,本類別之 建構子若有其他動作欲執行可在此處設計,#include class incount / Page;13-15 protected: int c1,c2; public: incount() c1=0;c2=1000; incount(int vc1, int vc2) c1=vc1; c2=vc2; void retcount(void) cout c1= c1 c2= c2 endl; incount operator + () c1+; c2+; return incou

25、nt(c1,c2); ; class dncount: public incount public: dncount(): incount() dncount(int a,int b):incount(a,b) dncount operator - () c1-; c2-; return dncount(c1,c2); ;,void main() dncount dc1,dc3; dncount dc2(200,500); dc1.retcount(); dc2.retcount(); dc1-; dc1.retcount(); dc2-; dc2-.retcount(); dc3=dc1-;

26、 dc3-.retcount(); ,Output: c1=0 c2=1000 c1=200 c2=500 c1=-1 c2=999 c1=198 c2=498 c1=-3 c2=997,衍生類別的member function 和基本類別的 member function 可以同名,物件呼叫 member function 時會依據物件的類別型態來執行該類別的 member fucntion。,#include #include const max=500; class queue protected: int qmax; int rear, front; public: queue() r

27、ear=front=0; cout queue initialization n; void qinsert(int i) rear+; qrear=i; cout rear= rear endl; int qdelete() front +; cout front= front endl; return qfront; ;,class queue2 : public queue public: void qinsert(int i) if (rearmax) queue:qinsert(i); else cout queue is full n; int qdelete() if (fron

28、trear) return queue:qdelete(); else cout queue underflow n; ; void main() queue2 a; a.qinsert(199); a.qinsert(200); cout 1: a.qdelete() endl; cout 2: a.qdelete() endl; cout 3: a.qdelete() endl; ,Output: queue initialization rear=1 rear=2 front=1 1:199 front=2 2:200 queue underflow,199,200,.,front,re

29、ar,衍生類別的建構子用以初始化新加入衍生類別的資料成員,而基本類別的建構子 用以初始化衍生類別繼承自基本類別之資料成員。,#include class incount protected: int c1,c2; public: incount() c1=0; c2=1000; incount(int vc1, int vc2) c1=vc1; c2=vc2; void retcount() cout c1= c1 c2= c2; incount operator +() c1+; c2+; return incount(c1,c2); ;,class dncount: public inco

30、unt private: int c3; public: dncount():incount() c3=10000; dncount(int vc1,int vc2,int vc3) :incount(vc1,vc2) c3=vc3; dncount operator - () c1-; c2-; c3-; return dncount(c1,c2,c3); void retcount() incount:retcount(); cout c3= c3 endl; ;,void main() dncount dc1,dc2; dc1.retcount(); dc2.retcount(); dc

31、1-; dc1.retcount(); dc2=dc1-; dc2-; dc2.retcount(); dncount dc3(-100,10,10000); dc3-; dc3-.retcount(); ,Output: c1=0 c2=1000 c3=10000 c1=0 c2=1000 c3=10000 c1=-1 c2=999 c3=9999 c1=-3 c2=997 c3=9997 c1=-102 c2=8 c3=9998,在衍生類別上新增基本類別的 data member 及 member function,使新類別功能更完整。,#include /Page:13-25 #incl

32、ude const int L=80; class person private: char nameL, idL; public: void input() cout name; cout id; void print() cout n ID No is: id; void printname() cout setw(8) name; ;,class student: public person private: char telL; unsigned long sno; public: void input() person:input(); cout tel; cout sno; voi

33、d print() person:print(); cout n Tel: t tel; cout n Score No: t sno; /void printname() / person:printname(); ;,class teacher : public person private: char degreeL, depL; public: void input() person: input(); cout degree; cout dep; void print() person:print(); cout n Degree: t” degree; cout n Departm

34、ent:” t dep; / void printname() / person:printname(); ;,void main() student s1; teacher t1; cout Input data for student 1:; s1.input(); cout Input data for teacher 1:; t1.input(); cout Data on teacher:; t1.printname(); t1.print(); cout Data on student:; s1.printname(); s1.print(); ,name id input() p

35、rint() printname(),person,tel scoreno input() print(),degree department input() print(),student,teacher,階層式的繼承,#include / Page:13-29 #include const int L=80; class person private: char nameL, idL; public: void input() cout name; cout id; void print() cout n ID No is: id; void printname() cout setw(8

36、) name; ;,class student: public person private: char telL; unsigned long sno; public: void input() person:input(); cout tel; cout sno; void print() person:print(); cout n Tel: t tel; cout n Score No: t sno; /void printname() / person:printname(); ;,class teacher : public person private: char degreeL

37、, depL; public: void input() person: input(); cout degree; cout dep; void print() person:print(); cout math; cout eng; void print() student:print(); cout n Math: t math; cout n Eng: t eng; cout n Average: t float (math+eng)/2; ;,void main() teacher t1; score c1; cout Input data for teacher 1:; t1.in

38、put(); cout Input data for score 1:; c1.input(); cout Data on teacher:; t1.printname(); t1.print(); cout n Data on student; c1.printname(); c1.print(); ,name id input() print() printname(),person,tel scoreno input() print(),degree department input() print(),math eng input() print(),student,teacher,s

39、core,多重繼承,#include #include const int L=80; class person private: char nameL, idL; public: void input() cout name; cout id; void print() cout addr; cout old; void print() cout n Address: t addr; cout n Years old: t old; ;,class student: public person private: char telL; unsigned long sno; public: vo

40、id input() person:input(); cout tel; cout sno; void print() person:print(); cout math; cout eng; ,void print() student:print(); stud:print(); cout n Math: t math; cout n Eng: t eng; cout n Average: t float (math+eng)/2; void printname() student:printname(); ; class employee: public person ;,void mai

41、n() score c1; employee e1; cout Input data for score 1:; c1.input(); cout Input data for employee 1:; e1.input(); cout n Data on student; c1.printname(); c1.print(); cout n Data on employee:; e1.printname(); e1.print(); ,Private: math eng Public: input() print() printname(),score,Private: addr old Public: input() print(),stud,employee,private,private,public,public,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!