版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C+語言程序設(shè)計(jì)語言程序設(shè)計(jì)第第4章章 類的繼承與派生類的繼承與派生2中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China 本章主要內(nèi)容本章主要內(nèi)容類的繼承與派生類的繼承與派生派生類成員的訪問屬性派生類成員的訪問屬性派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)多重繼承多重繼承3中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China4.1類的繼承與派生類的繼承與派生一、基本概念一、基本概念1. 派生與繼承的意義派生與繼承的意義n繼承
2、性繼承性 是面向?qū)ο蟪绦蛟O(shè)計(jì)語言的基本特性是面向?qū)ο蟪绦蛟O(shè)計(jì)語言的基本特性之一,是指在已有類的基礎(chǔ)上建立新的類。之一,是指在已有類的基礎(chǔ)上建立新的類。n它允許在構(gòu)造軟件系統(tǒng)的層次結(jié)構(gòu)中利用已它允許在構(gòu)造軟件系統(tǒng)的層次結(jié)構(gòu)中利用已存在類的部分或全部內(nèi)容,從而大大提高了存在類的部分或全部內(nèi)容,從而大大提高了軟件的重用性。軟件的重用性。n派生類派生類 它是繼承的直接產(chǎn)物它是繼承的直接產(chǎn)物,它是通過繼承已它是通過繼承已有類而產(chǎn)生的新類,是代碼重用的具體實(shí)現(xiàn)。有類而產(chǎn)生的新類,是代碼重用的具體實(shí)現(xiàn)。4中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North Unive
3、rsity of China昆蟲昆蟲有翅有翅無翅無翅蛾蛾蒼蠅蒼蠅蝴蝶蝴蝶如圖:昆蟲分類如圖:昆蟲分類5中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China2. 派生與繼承的概念派生與繼承的概念繼承:在定義一個(gè)類繼承:在定義一個(gè)類A時(shí),若它使用了一時(shí),若它使用了一個(gè)已定義類個(gè)已定義類B的部分或全部成員的部分或全部成員,則稱類則稱類A繼承了類繼承了類B,并稱類,并稱類 B為基類或父類為基類或父類,稱稱類類A為派生類或子類。為派生類或子類。派生:在派生:在C+語言中,稱一個(gè)類繼承另語言中,稱一個(gè)類繼承另一個(gè)類的過程為派生
4、一個(gè)類。一個(gè)類的過程為派生一個(gè)類。6中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China 3.基類和派生類基類和派生類n基類基類(父類父類) :已存在的用來派生新類的類;已存在的用來派生新類的類;n派生類派生類(子類子類):由已存在的類派生出的新類;:由已存在的類派生出的新類;n單繼承單繼承:從:從一個(gè)基類一個(gè)基類派生的繼承;派生的繼承;n多繼承多繼承:從:從多個(gè)基類多個(gè)基類派生的繼承;派生的繼承;基類基類派生類派生類ABACB單繼承單繼承多繼承多繼承w基類與派生類基類與派生類w單繼承與多繼承單繼承與多繼承7中北大
5、學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China二、派生類的定義格式二、派生類的定義格式class : ;1.單繼承派生類的聲明形式:單繼承派生類的聲明形式:8中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China二、派生類的定義格式二、派生類的定義格式(續(xù)續(xù)) 2. 繼承方式繼承方式public:公有公有繼承;繼承;private:私有私有繼承;繼承;protected:保護(hù)保護(hù)繼承;繼承;作用:控制基類中聲明的成員在多大的范作用:控制基
6、類中聲明的成員在多大的范圍內(nèi)能被派生類的用戶訪問;圍內(nèi)能被派生類的用戶訪問;9中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China派生類派生類私有成員私有成員公有成員公有成員保護(hù)成員保護(hù)成員私有成員私有成員公有成員公有成員保護(hù)成員保護(hù)成員基類部分基類部分新定義部分新定義部分派生類成員派生類成員派生類的構(gòu)成派生類的構(gòu)成三、派生類的構(gòu)成三、派生類的構(gòu)成10中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China構(gòu)造派生類的過程:構(gòu)造派生類的過程
7、:n從基類接收成員;從基類接收成員;n調(diào)整從基類接收的成員;調(diào)整從基類接收的成員;n聲明派生類的新增成員;聲明派生類的新增成員;n定義派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。定義派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。三、派生類的構(gòu)成三、派生類的構(gòu)成(續(xù)續(xù))11中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China四、基類與派生類的關(guān)系四、基類與派生類的關(guān)系基類是對(duì)若干個(gè)派生類的抽象,而派生類是基基類是對(duì)若干個(gè)派生類的抽象,而派生類是基類的具體化;基類抽取了它的派生類的公共特征,類的具體化;基類抽取了它的派生類的公共特征,而派生類通過增加行
8、為將抽象類變?yōu)槟撤N有用的類而派生類通過增加行為將抽象類變?yōu)槟撤N有用的類型。型。1、派生類是基類的具體化派生類是基類的具體化2、派生類是基類定義的延續(xù)派生類是基類定義的延續(xù)派生類將其自身與基類區(qū)別開來的方法是添加派生類將其自身與基類區(qū)別開來的方法是添加數(shù)據(jù)成員和成員函數(shù);數(shù)據(jù)成員和成員函數(shù);3、派生類是基類的組合派生類是基類的組合12中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China 4.2派生類成員的派生類成員的訪問屬性訪問屬性公有基類公有基類公有派生類公有派生類特點(diǎn):特點(diǎn):n基類的公有成員和保護(hù)成員作為派生類的
9、成基類的公有成員和保護(hù)成員作為派生類的成員時(shí),都保持原有的訪問屬性,而基類的私員時(shí),都保持原有的訪問屬性,而基類的私有成員仍然為基類私有。有成員仍然為基類私有。 公有繼承公有繼承(public)13中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China私有基類私有基類私有派生類私有派生類特點(diǎn):特點(diǎn):n基類的公有成員和保護(hù)成員作為派生類的成基類的公有成員和保護(hù)成員作為派生類的成員時(shí),都作為派生類的私有成員,且不能被員時(shí),都作為派生類的私有成員,且不能被這一派生類的子類訪問,而基類的私有成員這一派生類的子類訪問,而基類的
10、私有成員仍然為基類私有。仍然為基類私有。n不能通過派生類對(duì)象引用從私有基類繼承過不能通過派生類對(duì)象引用從私有基類繼承過來的任何成員。來的任何成員。 4.2派生類成員的派生類成員的訪問屬性訪問屬性 (續(xù)續(xù)) 私有繼承私有繼承(private)14中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China 保護(hù)繼承保護(hù)繼承(protected) 4.2派生類成員的派生類成員的訪問屬性訪問屬性 (續(xù)續(xù))保護(hù)成員:受保護(hù)的成員不能被類的外保護(hù)成員:受保護(hù)的成員不能被類的外部訪問,但可以被派生類成員函數(shù)訪問部訪問,但可以被派生類成
11、員函數(shù)訪問保護(hù)繼承保護(hù)繼承n保護(hù)基類保護(hù)基類n保護(hù)派生類保護(hù)派生類n特點(diǎn):基類的公有成員和保護(hù)成員作為派生特點(diǎn):基類的公有成員和保護(hù)成員作為派生類的成員時(shí),都作為派生類的保護(hù)成員,而類的成員時(shí),都作為派生類的保護(hù)成員,而基類的私有成員仍然為基類私有基類的私有成員仍然為基類私有.15中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China基類的訪問特性基類的訪問特性類的繼承特性類的繼承特性子類的訪問特性子類的訪問特性PublicProtectedPrivatePublicPublicProtectedNo accessP
12、ublicProtectedPrivateProtectedProtectedProtectedNo accessPublicProtectedPrivatePrivatePrivatePrivateNo access表:繼承對(duì)基類成員的訪問能力表:繼承對(duì)基類成員的訪問能力 4.2派生類成員的派生類成員的訪問屬性訪問屬性 (續(xù)續(xù))16中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China類類B為類為類A的直接派生類,的直接派生類,類類C為類為類A的間接派生類;的間接派生類;類類A是類是類B的直接基類,的直接基類, 是
13、類是類C的間接基類;的間接基類;類類C對(duì)類對(duì)類A的成員的訪問屬的成員的訪問屬性,由類性,由類A成員的訪問屬性、成員的訪問屬性、類類B的繼承方式、類的繼承方式、類C的繼的繼承方式共同決定。承方式共同決定。 4.2派生類成員的派生類成員的訪問屬性訪問屬性 (續(xù)續(xù)) 多級(jí)派生的訪問屬性多級(jí)派生的訪問屬性類類 A類類 B類類 C17中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China例例分析下列程序中的訪問權(quán)限。分析下列程序中的訪問權(quán)限。 4.2派生類成員的派生類成員的訪問屬性訪問屬性 (續(xù)續(xù))class Location
14、public: void InitL(int xx,int yy); void Move(int xOff,int yOff); int GetX() return X; int GetY() return Y;private: int X,Y;void Location:InitL(int xx,int yy) X=xx; Y=yy;void Location:Move(int xOff,int yOff) X+=xOff; Y+=yOff;18中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of Chinaclass Re
15、ctangle:public Locationpublic: void InitR(int x,int y,int w,int h); int GetH() return H; int GetW() return W;private: int H,W;void Rectangle:InitR(int x,int y,int w,int h) InitL(x,y); W=w; H=h;公有繼承公有繼承19中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China#include using namespace std;vo
16、id main() Rectangle rect; rect.InitR(2,3,20,10); rect.Move(3,2); coutrect.GetX(), rect.GetY(), rect.GetH(), rect.GetW()endl;輸出:輸出:5,5,10,2020中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China/派生類派生類class V:public Rectanglepublic: void Function();void V:Function() Move(3,2);公有繼承公有繼承若繼
17、承方式為private,Move(3,2)是否正確?為什么?若繼承方式為若繼承方式為private,Move(3,2)仍然仍然正確正確。原因原因:由于類:由于類Rectangle對(duì)類對(duì)類Location是公有繼承,是公有繼承,而類而類V對(duì)類對(duì)類Rectangle是是直接繼承直接繼承,因此在類,因此在類V內(nèi)內(nèi)可以訪問基類可以訪問基類Location的公有成員的公有成員;21中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of Chinaclass Rectangle:private Locationpublic: void In
18、itR(int x,int y,int w,int h); int GetH() return H; int GetW() return W;private: int W,H;void Rectangle:InitR(int x,int y,int w,int h) InitL(x,y); W=w; H=h;私有繼承私有繼承直接繼承,正確直接繼承,正確22中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China#include void main() Rectangle rect; rect.InitR(2,3,20,
19、10); rect.Move(3,2); coutrect.GetX(), rect.GetY(), rect.GetH(), rect.GetW()endl;錯(cuò)誤/修改修改class Rectangle:private Locationpublic: void InitR(int x,int y,int w,int h); void Move(int xOff,int yOff)23中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China Location:Move(xOff,yOff); int GetX() re
20、turn Location:GetX(); int GetY() return Location:GetY(); int GetH() return H; int GetW() return W;private: int W,H;void Rectangle:InitR(int x,int y,int w,int h) InitL(x,y); W=w; H=h;通過通過成員名限定符成員名限定符(:)指明調(diào)用基類中的成員指明調(diào)用基類中的成員24中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of Chinaclass V:pub
21、lic Rectanglepublic: void Function();void V:Function() Move(3,2); 公有繼承公有繼承若繼承方式為若繼承方式為private,Move(3,2)是否正確是否正確?為什么為什么?若繼承方式為若繼承方式為private,Move(3,2)仍然仍然錯(cuò)誤錯(cuò)誤。原因原因:由于類:由于類Rectangle對(duì)類對(duì)類Location是私有繼承,是私有繼承,而類而類V對(duì)類對(duì)類Rectangle是是直接繼承直接繼承,因此在類,因此在類V內(nèi)內(nèi)不不可以訪問基類可以訪問基類Location的公有成員的公有成員;錯(cuò)誤調(diào)用錯(cuò)誤調(diào)用25中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中
22、北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China 成員訪問權(quán)限的控制成員訪問權(quán)限的控制例例分析下列程序中的訪問權(quán)限,并回答問題。分析下列程序中的訪問權(quán)限,并回答問題。#include class Apublic: void f1();protected: int j1;private: int i1;class B:public Apublic: void f2();protected: int j2;private: int i2;class C:public Bpublic: void f3();26中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)
23、計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China回答下列問題,并說明原因?;卮鹣铝袉栴},并說明原因。1、派生類、派生類B中成員函數(shù)中成員函數(shù)f2()能否訪問基類能否訪問基類A中的成中的成員:員:f1()、j1和和i1?2、派生類、派生類B的對(duì)象的對(duì)象b1能否訪問基類能否訪問基類A中的成員:中的成員:f1()、j1和和i1?可以訪問可以訪問f1()和和j1,不可以訪問不可以訪問i1;可以訪問可以訪問f1(),不可以訪問不可以訪問j1和和i1;3、派生類、派生類C中的成員函數(shù)中的成員函數(shù)f3()能否訪問直接基類能否訪問直接基類B中的成員:中的成員:
24、f2()、j2和和i2?能否訪問間接基類能否訪問間接基類A中的成員:中的成員: f1()、j1和和i1?可以訪問直接基類中的可以訪問直接基類中的f2()和和j2以及間接基類中以及間接基類中的的f1()和和j1,不可以訪問不可以訪問i2和和i1;27中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China4、派生類、派生類C的對(duì)象的對(duì)象c1能否訪問直接基類能否訪問直接基類B中的成員:中的成員:f2()、j2和和i2?能否訪問間接基類能否訪問間接基類A中的成員:中的成員: f1()、j1和和i1?可以訪問直接基類中的可以訪
25、問直接基類中的f2()以及間接基類中的以及間接基類中的f1(),其他都不可以訪問;其他都不可以訪問;28中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China派生類對(duì)象生成時(shí),要調(diào)用構(gòu)造函數(shù)進(jìn)派生類對(duì)象生成時(shí),要調(diào)用構(gòu)造函數(shù)進(jìn)行初始化。編譯器的調(diào)用過程是先調(diào)用行初始化。編譯器的調(diào)用過程是先調(diào)用基類的構(gòu)造函數(shù),對(duì)派生類中的基類數(shù)基類的構(gòu)造函數(shù),對(duì)派生類中的基類數(shù)據(jù)進(jìn)行初始化,然后再調(diào)用派生類自己據(jù)進(jìn)行初始化,然后再調(diào)用派生類自己的構(gòu)造函數(shù),對(duì)派生類的數(shù)據(jù)進(jìn)行初始的構(gòu)造函數(shù),對(duì)派生類的數(shù)據(jù)進(jìn)行初始化工作。析構(gòu)函數(shù)的調(diào)用正
26、好相反?;ぷ?。析構(gòu)函數(shù)的調(diào)用正好相反。 4.3派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù) 構(gòu)造構(gòu)造和析構(gòu)函數(shù)的訪問和析構(gòu)函數(shù)的訪問29中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China基類子對(duì)象基類子對(duì)象:派生類的對(duì)象中由基類中說明的:派生類的對(duì)象中由基類中說明的數(shù)據(jù)成員和操作所構(gòu)成的封裝體;數(shù)據(jù)成員和操作所構(gòu)成的封裝體;基類子對(duì)象基類子對(duì)象由由基類基類中的中的構(gòu)造函數(shù)構(gòu)造函數(shù)進(jìn)行進(jìn)行初始化初始化;構(gòu)造函數(shù)不能被繼承;構(gòu)造函數(shù)不能被繼承;派生類構(gòu)造函數(shù)的工作:派生類構(gòu)造函數(shù)的工作:k對(duì)自己的數(shù)據(jù)成員進(jìn)
27、行初始化;對(duì)自己的數(shù)據(jù)成員進(jìn)行初始化;k負(fù)責(zé)調(diào)用基類構(gòu)造函數(shù)使基類的數(shù)據(jù)成員得負(fù)責(zé)調(diào)用基類構(gòu)造函數(shù)使基類的數(shù)據(jù)成員得以初始化;以初始化;k調(diào)用子對(duì)象的構(gòu)造函數(shù),對(duì)派生類中的子對(duì)調(diào)用子對(duì)象的構(gòu)造函數(shù),對(duì)派生類中的子對(duì)象進(jìn)行初始化;象進(jìn)行初始化; 一、派生類的構(gòu)造函數(shù)一、派生類的構(gòu)造函數(shù)30中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China派生類構(gòu)造函數(shù)格式:派生類構(gòu)造函數(shù)格式:若某項(xiàng)的若某項(xiàng)的參數(shù)表為空參數(shù)表為空,則該項(xiàng)可從成員初始化列,則該項(xiàng)可從成員初始化列表中省略,表示使用表中省略,表示使用缺省構(gòu)造函數(shù)缺省構(gòu)造
28、函數(shù)初始化該基類子初始化該基類子對(duì)象;對(duì)象;():(), ()說明:說明:31中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China#include class Apublic: A(int h,int w):he(h),we(w) A() couthe,weendl;private: int he, we;class B:public Apublic: B(int h,int w,int h1,int w1,int l):A(h,w), obj1(h1,w1)len=l; B()coutlenendl; priva
29、te: A obj1; int len; ;void main() B obj(1,2,3,4,5); 32中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China派生類構(gòu)造函數(shù)調(diào)用順序派生類構(gòu)造函數(shù)調(diào)用順序:k基類的構(gòu)造函數(shù);基類的構(gòu)造函數(shù);k子對(duì)象的構(gòu)造函數(shù);子對(duì)象的構(gòu)造函數(shù);k派生類構(gòu)造函數(shù)體;派生類構(gòu)造函數(shù)體;33中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China 二、派生類的析構(gòu)函數(shù)二、派生類的析構(gòu)函數(shù)執(zhí)行派生類的析構(gòu)函數(shù)時(shí),基
30、類的析構(gòu)函數(shù)也執(zhí)行派生類的析構(gòu)函數(shù)時(shí),基類的析構(gòu)函數(shù)也將被調(diào)用;將被調(diào)用;析構(gòu)函數(shù)不能被繼承;析構(gòu)函數(shù)不能被繼承;析構(gòu)函數(shù)的執(zhí)行順序與構(gòu)造函數(shù)嚴(yán)格析構(gòu)函數(shù)的執(zhí)行順序與構(gòu)造函數(shù)嚴(yán)格相反相反;k派生類的析構(gòu)函數(shù);派生類的析構(gòu)函數(shù);k基類的析構(gòu)函數(shù);基類的析構(gòu)函數(shù);34中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China例例分析下列程序的輸出結(jié)果。分析下列程序的輸出結(jié)果。#include class Bpublic: B(); B(int i); B(); void Print() const;private: int
31、b;B:B() b=0; coutBs default constructor called. endl;35中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of ChinaB:B(int i) b=i; coutBs constructor called. endl; B:B() coutBs destructor called. endl;void B:Print() const coutbendl;class C:public B36中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2Nor
32、th University of Chinapublic: C(); C(int i,int j); C(); void Print() const; private: int c;C:C() c=0; coutCs default constructor called. endl;C:C(int i,int j):B(i) c=j;37中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China coutCs constructor called. endl;C:C() coutCs destructor called.
33、 endl;void C:Print() const B:Print(); coutcendl;void main() C obj(5,6); obj.Print();輸出:輸出:Bs constructor called.Cs constructor called.56Cs destructor called.Bs destructor called.38中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China三、派生類構(gòu)造函數(shù)使用中應(yīng)注意的問題三、派生類構(gòu)造函數(shù)使用中應(yīng)注意的問題派生類派生類構(gòu)造函數(shù)的定義中可以構(gòu)造
34、函數(shù)的定義中可以省略省略對(duì)對(duì)基類構(gòu)造基類構(gòu)造函數(shù)函數(shù)的調(diào)用,其條件是在基類中必須有的調(diào)用,其條件是在基類中必須有缺省的缺省的構(gòu)造函數(shù)構(gòu)造函數(shù)或者根本或者根本沒有定義沒有定義任何任何構(gòu)造函數(shù)構(gòu)造函數(shù);當(dāng)基類的構(gòu)造函數(shù)使用一個(gè)或多個(gè)參數(shù)時(shí),派當(dāng)基類的構(gòu)造函數(shù)使用一個(gè)或多個(gè)參數(shù)時(shí),派生類必須定義構(gòu)造函數(shù),提供將參數(shù)傳遞給基生類必須定義構(gòu)造函數(shù),提供將參數(shù)傳遞給基類構(gòu)造函數(shù)的途徑;類構(gòu)造函數(shù)的途徑;編譯器自動(dòng)生成缺省構(gòu)造函數(shù)編譯器自動(dòng)生成缺省構(gòu)造函數(shù)設(shè)設(shè)基類基類數(shù)據(jù)成員為數(shù)據(jù)成員為m個(gè),個(gè),派生類派生類數(shù)據(jù)成員為數(shù)據(jù)成員為n個(gè),個(gè),派生類的派生類的參數(shù)參數(shù)個(gè)數(shù)為個(gè)數(shù)為x,則:則:0=x=m+n;39中
35、北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China4.4 多繼承的概念多繼承的概念class : , ;一、多繼承派生類的聲明形式:一、多繼承派生類的聲明形式:40中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China二、多繼承的構(gòu)造函數(shù)二、多繼承的構(gòu)造函數(shù)():(), () (),.多繼承構(gòu)造函數(shù)格式:多繼承構(gòu)造函數(shù)格式:41中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North Universit
36、y of China二、多繼承的構(gòu)造函數(shù)二、多繼承的構(gòu)造函數(shù)(續(xù)續(xù))派生類構(gòu)造函數(shù)負(fù)責(zé)所有基類構(gòu)造函數(shù)的調(diào)用;派生類構(gòu)造函數(shù)負(fù)責(zé)所有基類構(gòu)造函數(shù)的調(diào)用;派生類構(gòu)造函數(shù)執(zhí)行順序:派生類構(gòu)造函數(shù)執(zhí)行順序:k執(zhí)行所有基類的構(gòu)造函數(shù);執(zhí)行所有基類的構(gòu)造函數(shù);k執(zhí)行所有子對(duì)象的構(gòu)造函數(shù);執(zhí)行所有子對(duì)象的構(gòu)造函數(shù);k執(zhí)行派生類構(gòu)造函數(shù)體;執(zhí)行派生類構(gòu)造函數(shù)體;處于同一層次的處于同一層次的各基類構(gòu)造函數(shù)的執(zhí)行順序各基類構(gòu)造函數(shù)的執(zhí)行順序取決取決于于定義派生類定義派生類時(shí)所指定的各基類時(shí)所指定的各基類順序順序,與派生類,與派生類構(gòu)造函數(shù)中所定義的成員初始化列表中的各項(xiàng)順構(gòu)造函數(shù)中所定義的成員初始化列表中的各項(xiàng)
37、順序無關(guān);序無關(guān);42中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China例例分析下列程序的輸出結(jié)果。分析下列程序的輸出結(jié)果。#include class B1public: B1(int i) b1=i; coutConstructor B1. endl; void Print() coutb1endl;private: int b1;class B2public: B2(int i) b2=i; coutConstructor B2. endl; void Print() coutb2endl;43中北大學(xué)計(jì)算
38、機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of Chinaprivate: int b2;class B3public: B3(int i) b3=i; coutConstructor B3. endl; int Getb3() return b3;private: int b3;class A:public B2,public B1public: A(int i,int j,int k,int l);多繼承44中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of
39、China void Print();private: int a; B3 bb;A:A(int i,int j,int k,int l):B1(i),B2(j),bb(k) a=l; coutConstructor A. endl; void A:Print() B1:Print(); B2:Print(); coutabb.Getb3()endl;子對(duì)象子對(duì)象基類構(gòu)造函數(shù)調(diào)用順序基類構(gòu)造函數(shù)調(diào)用順序與定義時(shí)的順序不同與定義時(shí)的順序不同45中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of Chinavoid main()
40、 A aa(1,2,3,4); aa.Print();輸輸出出Constructor B2.Constructor B1.Constructor B3.Constructor A.124 346中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China三、二義性問題三、二義性問題1、產(chǎn)生二義性的原因、產(chǎn)生二義性的原因在在多繼承多繼承情況下,造成的對(duì)情況下,造成的對(duì)基類基類中中某個(gè)成員某個(gè)成員的的訪問訪問出現(xiàn)的出現(xiàn)的不唯一不唯一的情況;的情況;class Aclass C:public A,public B public:
41、 public: void f(); void g(); void h();class B ;public: void f(); void g();void f();c1.f()A.f()B.f()C47中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China三、二義性問題(續(xù))三、二義性問題(續(xù))問題:若定義問題:若定義C c1;,則則c1.f()是否正確?是否正確?答答:c1.f()將產(chǎn)生將產(chǎn)生二義性二義性;原因原因:不能識(shí)別是調(diào)用類不能識(shí)別是調(diào)用類A或類或類B的的f函數(shù);函數(shù);解決方法:解決方法:a.區(qū)別出是類區(qū)
42、別出是類A或類或類B的的f函數(shù);函數(shù);c1.A:f();或或c1.B:f();b.在類中定義同名函數(shù)在類中定義同名函數(shù)f;當(dāng)一個(gè)當(dāng)一個(gè)派生類派生類從從多個(gè)基類多個(gè)基類派生,而這些基類又派生,而這些基類又有一個(gè)有一個(gè)共同的基類共同的基類,則對(duì)該基類中說明的成員,則對(duì)該基類中說明的成員進(jìn)行訪問時(shí),可能會(huì)出現(xiàn)二義性;進(jìn)行訪問時(shí),可能會(huì)出現(xiàn)二義性;48中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China三、二義性問題(續(xù))三、二義性問題(續(xù))class Aclass B2:public A public: private:
43、 int a; int b2; ;class B1:public Aclass C:public B1,public B2 private: public: int b1; int f(); private: int c; ;c1.aA.aB1.b1CB2.b2A.a49中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China三、二義性問題(續(xù))三、二義性問題(續(xù))問題:若定義問題:若定義C c1;,則則c1.a與與c1.A:a是否正確?是否正確?答答:c1.a與與c1.A:a將產(chǎn)生將產(chǎn)生二義性二義性;原因原因:不能識(shí)
44、別是通過類不能識(shí)別是通過類B1或類或類B2調(diào)用類調(diào)用類A的的a;解決方法:解決方法:a.區(qū)別出是通過類區(qū)別出是通過類B1或類或類B2調(diào)用類調(diào)用類A的的a;c1.B1:a;或或c1.B2:a;b.在類中定義一個(gè)同名成員;在類中定義一個(gè)同名成員;2、解決方法、解決方法利用成員名限定法消除二義性;利用成員名限定法消除二義性;在類中定義一個(gè)同名成員;在類中定義一個(gè)同名成員;虛基類;虛基類;50中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China例例分析下列程序的輸出結(jié)果分析下列程序的輸出結(jié)果。 #include class
45、 A public: A(int i) a=i; coutConstructor A. iendl; A() coutDestructor A. endl; void Print() coutaendl; private: int a; ; class B1:public A public: B1(int i,int j):A(i) b1=j; coutConstructor B1. endl; 51中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China B1() coutDestructor B1. endl; v
46、oid Print() A:Print(); coutb1endl; private: int b1;class B2:public Apublic: B2(int i,int j):A(i) b2=j; coutConstructor B2. endl; B2() coutDestructor B2. endl; void Print() A:Print();coutb2endl; private: int b2;52中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of Chinaclass C:public B1,publ
47、ic B2public: C(int i,int j,int k,int l,int m):B1(i,j),B2(k,l),c(m) coutConstructor C. endl; C() coutDestructor C. endl; void Print() B1:Print(); B2:Print(); coutcendl; private: int c;void main() C c1(1,2,3,4,5); c1.Print();53中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of ChinaConstruct
48、or A.1Constructor B1. Constructor A.3Constructor B2.Constructor C.12345Destructor C.Destructor B2.Destructor A.Destructor B1.Destructor A.執(zhí)執(zhí)行行結(jié)結(jié)果果54中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of China4.5虛基類的引入和說明虛基類的引入和說明引入目的:引入目的:解決二義性問題,在繼承間接共同解決二義性問題,在繼承間接共同基類時(shí)只保留一份成員基類時(shí)只保留一份成員格式:格式
49、:virtual 說明:說明:關(guān)鍵字關(guān)鍵字virtual與關(guān)鍵字與關(guān)鍵字public或或private的相對(duì)的相對(duì)位置無關(guān),但必須位于虛基類名之前,且位置無關(guān),但必須位于虛基類名之前,且virtual只只對(duì)緊隨其后的基類名起作用;對(duì)緊隨其后的基類名起作用;例如:例如:class D:virtual public A,private B,virutal public C其中:類其中:類A和類和類C是是虛基類虛基類,而類,而類B是是非虛基類非虛基類;55中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室中北大學(xué)計(jì)算機(jī)系基礎(chǔ)教研室2022-6-5 2013-2North University of Chinaclass Apublic: void f();protected: int a;class B:virtual public Aprotected: int b;class
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小小B超告訴你胎寶寶的健康成長課件
- 2025年廣東江門市臺(tái)山市城鄉(xiāng)建設(shè)投資開發(fā)有限公司招聘筆試參考題庫附帶答案詳解
- 2025年四川省長虹美菱中國區(qū)招聘筆試參考題庫含答案解析
- 2025年赤峰中色鋅業(yè)有限公司招聘筆試參考題庫含答案解析
- 2025年溫州設(shè)計(jì)集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 2025年陜西延長石油氣田公司招聘筆試參考題庫含答案解析
- 2025年江蘇啟晟集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 2024版簡易個(gè)人土地承包合同范本
- 2024版電纜線采購合同電纜供貨合同
- 2024版聯(lián)合代理銷售合同
- 2023年二輪復(fù)習(xí)解答題專題二:一次函數(shù)的應(yīng)用方案設(shè)計(jì)型(原卷版+解析)
- 木制家具保修協(xié)議
- 彈性力學(xué)仿真軟件:ANSYS:優(yōu)化設(shè)計(jì)與靈敏度分析技術(shù)教程
- 2024上海市化工職業(yè)病防治院上海市職業(yè)安全健康研究院工作人員招聘20人(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- 網(wǎng)安民警個(gè)人工作總結(jié)
- JGJ142-2012 輻射供暖供冷技術(shù)規(guī)程
- 黃金買賣合同范本
- 物業(yè)管理流程:高端寫字樓服務(wù)
- JTG-B01-2014公路工程技術(shù)標(biāo)準(zhǔn)
- 海員常見疾病的保健與預(yù)防
- 易錯(cuò)題(試題)-2024一年級(jí)上冊(cè)數(shù)學(xué)北師大版含答案
評(píng)論
0/150
提交評(píng)論