《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第3章 繼承與派生_第1頁
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第3章 繼承與派生_第2頁
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第3章 繼承與派生_第3頁
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第3章 繼承與派生_第4頁
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第3章 繼承與派生_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

目錄3.1類的繼承與派生3.2派生類的構(gòu)造與析構(gòu)函數(shù)3.3二義性問題與虛基類3.4Qt自定義派生類3.5Qt中的界面3.6Qt常用部件3.1.1派生類的定義交通工具汽車船水陸兩棲車房子房車基類派生類基類派生類基類只有一個(gè)基類,是單繼承有不止一個(gè)基類,是多繼承3.1.1派生類的定義定義格式: class

派生類名

:繼承方式基類1,…,繼承方式基類n//有多個(gè)基類時(shí), { //之間用逗號隔開,每個(gè)

//基類都要寫明繼承方式

派生類新增成員的聲明 };三選一:

public private protected3.1.1派生類的定義class

Conveyance

{

double

speed;

//時(shí)速

public:

double

getSpeed()

{

return

speed;

}

};class

Car

:

public

Conveyance

{

int

wheelsNum;

//車輪數(shù)

public:

int

getWheelsNum()

{

return

wheelsNum;

}

};

Conveyance類

speed

getSpeed()

Car類

speed

getSpeed()

wheelsNum

getWheelsNum()新增成員繼承3.1.1派生類的定義class

House{

double

area;

//房屋面積

public:

double

getArea()

{

return

area;

}

};class

MotorHome:public

Car,public

House

{

int

waterReserve;

//儲(chǔ)水量,單位升

public:

int

getWaterReserve()

{

return

waterReserve;

}

};Car類

speed

getSpeed()

wheelsNum

getWheelsNum()Speed()

House類

area

getArea()

MotorHome類

waterReserve

getWaterReserve()

speed

getSpeed()

wheelsNum

getWheelsNum()

area

getArea()

繼承繼承新增成員3.1.2繼承方式

基類成員函數(shù)基類對象private繼承方式protected繼承方式public繼承方式派生類新增成員函數(shù)派生類對象派生類新增成員函數(shù)派生類對象派生類新增成員函數(shù)派生類對象基類private成員可訪問不可訪問基類protected成員不可訪問可訪問,訪問權(quán)限轉(zhuǎn)為private不可訪問可訪問,訪問權(quán)限仍為或轉(zhuǎn)為protected不可訪問可訪問,訪問權(quán)限仍為protected不可訪問基類public成員可訪問可訪問,訪問權(quán)限仍為public可訪問表3-1繼承方式和訪問特性從使用上而言,私有繼承和保護(hù)繼承方式似乎沒有區(qū)別。那么區(qū)分兩者的意義是什么呢?3.1.2繼承方式保護(hù)繼承自公有繼承自祖先類

private:

protected:

public:

父親類

private:

protected:

protected:

孩子類

private:

protected:

protected:私有繼承自公有繼承自祖先類

private:

protected:

public:

父親類

private:

private:private:孩子類

private:

private:

private:

圖3-3保護(hù)繼承和私有繼承的區(qū)別保護(hù)權(quán)限成員既實(shí)現(xiàn)了數(shù)據(jù)隱藏又很好地實(shí)現(xiàn)了繼承,而私有權(quán)限成員只是很好地實(shí)現(xiàn)了數(shù)據(jù)隱藏。3.1.3重定義成員函數(shù)派生類中允許聲明和基類中的成員函數(shù)原型完全相同的新成員函數(shù),新的同名成員函數(shù)需有自己新的函數(shù)實(shí)現(xiàn),稱作重定義成員函數(shù)(或重定義繼承的函數(shù))。例:在Conveyance類中聲明公有成員函數(shù)showInfo,并在類外定義如下:void

Conveyance::showInfo(){

cout<<"Speed

per

hour:"<<speed<<endl;

}在Car類中聲明公有成員函數(shù)showInfo,并在類外定義如下:void

Car::showInfo(){

cout<<"Speed

per

hour:"<<getSpeed()<<endl;

cout<<"Number

of

wheels:"<<wheelsNum<<endl;

}Car

myCar;myCar.showInfo();

myCar.Car::showInfo();Conveyance::showInfo();3.1.4賦值兼容規(guī)則公有繼承時(shí),派生類對象可以賦值給基類對象?;悓ο蟛荒苜x值給派生類對象?;悓ο?/p>

基類屬性的內(nèi)存空間派生類對象

基類屬性的內(nèi)存空間派生類新增屬性的內(nèi)存空間值復(fù)制

該部分值在賦值時(shí)被舍棄

3.1.4賦值兼容規(guī)則在用到基類對象時(shí)可以用其公有派生類對象代替,使用途徑有:可使用公有派生類對象賦值或初始化基類對象的引用。函數(shù)形參是基類對象(或引用),對應(yīng)的實(shí)參可使用其派生類對象。派生類對象的地址可以賦給指向基類對象的指針。例:有函數(shù):void

func(Conveyance

a){

a.showInfo();

}在已有Car類型對象myCar的情況下:語句:

Conveyance

x1,&x2=myCar,*ptr;

ptr=&myCar;

x1=myCar;

func(myCar);都是合法的。目錄3.1類的繼承與派生3.2派生類的構(gòu)造與析構(gòu)函數(shù)3.3二義性問題與虛基類3.4Qt自定義派生類3.5Qt中的界面3.6Qt常用部件3.2派生類的構(gòu)造與析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)不能被派生類所繼承,派生類中需要聲明和實(shí)現(xiàn)自己的構(gòu)造函數(shù),以及必要的時(shí)候自定義析構(gòu)函數(shù)。注意:派生類構(gòu)造函數(shù)在實(shí)現(xiàn)時(shí),只需對本類中新增的成員進(jìn)行初始化,基類部分的初始化會(huì)自動(dòng)調(diào)用基類構(gòu)造函數(shù)完成。派生類析構(gòu)函數(shù)同理。3.2.1實(shí)現(xiàn)方式構(gòu)造函數(shù)定義的格式:

派生類類名::派生類類名(基類所需形參,本類數(shù)據(jù)成員所需形參) :基類名(基類實(shí)參) {

新增數(shù)據(jù)成員賦初值;//最好也寫在初始化列表處 }基類聲明了帶參構(gòu)造函數(shù)時(shí),派生類也應(yīng)聲明帶參構(gòu)造函數(shù),并傳參數(shù)給基類構(gòu)造函數(shù)?;惵暶髁瞬粠?gòu)造函數(shù)時(shí),派生類構(gòu)造函數(shù)可不向基類構(gòu)造函數(shù)傳遞參數(shù)。此時(shí),基類部分的初始化調(diào)用的是基類不帶參構(gòu)造函數(shù)。若基類中未聲明構(gòu)造函數(shù),派生類中也可以不聲明,此時(shí)全采用默認(rèn)的構(gòu)造函數(shù)。不限順序3.2.1實(shí)現(xiàn)方式例:Conveyance類內(nèi)添加公有構(gòu)造函數(shù)如下:

Conveyance(int

spd):speed(spd)

{

cout<<"Constructor

of

Conveyance."<<endl;

}多基類的例子:House類內(nèi)添加公有構(gòu)造函數(shù)如下:

House(double

a):area(a)

{

cout<<"constructor

of

House."<<endl;

}則Car類內(nèi)可添加公有構(gòu)造函數(shù)如下:

Car(int

spd,int

wN)

:Conveyance(spd),wheelsNum(wN)

{

cout<<"Constructor

of

Car."<<endl;

}則MotorHome類內(nèi)可添加公有構(gòu)造函數(shù)如下:

MotorHome(int

spd,int

wN,double

a,int

wR)

:Car(spd,wN),House(a),waterReserve(wR)

{

}3.2.1實(shí)現(xiàn)方式派生類中有新增成員對象時(shí)的情形:需要初始化對象成員,值由派生類的構(gòu)造函數(shù)傳遞。

派生類類名::派生類類名(基類所需形參,新增成員對象所需形參

,本類數(shù)據(jù)成員所需形參) :基類名(基類實(shí)參),新增成員對象名(新增成員對象的實(shí)參) {

新增數(shù)據(jù)成員賦初值;//最好也寫在初始化列表處 }析構(gòu)函數(shù)因?yàn)椴粠?shù),因此其聲明與實(shí)現(xiàn)和普通類中的析構(gòu)函數(shù)是一樣的。例3_13.2.2調(diào)用順序在派生類對象初始化時(shí)的順序如下:將對象初始化時(shí)給出的實(shí)參值傳遞給派生類構(gòu)造函數(shù)的形參;按照派生類定義時(shí)基類列表中的順序,依次調(diào)用各個(gè)基類的構(gòu)造函數(shù);按照派生類中新增數(shù)據(jù)成員(包括成員對象)在類中聲明的順序,依次初始化每個(gè)數(shù)據(jù)成員;執(zhí)行派生類構(gòu)造函數(shù)的函數(shù)體。析構(gòu)函數(shù)執(zhí)行的順序和構(gòu)造函數(shù)嚴(yán)格相反。例3_1目錄3.1類的繼承與派生3.2派生類的構(gòu)造與析構(gòu)函數(shù)3.3二義性問題與虛基類3.4Qt自定義派生類3.5Qt中的界面3.6Qt常用部件3.3.1二義性問題AmphibianAuto類中有兩個(gè)speed、兩個(gè)manuDate數(shù)據(jù)成員和兩個(gè)getSpeed成員函數(shù)。它們實(shí)際上都來源于祖先類Conveyance。該如何區(qū)分它們呢?Conveyance類

speedmanuDate

getSpeed()Car類

speedmanuDate

getSpeed()wheelsNumtestTimegetWheelsNum()

Ship類

speedmanuDate

getSpeed()draughtgetDraught()AmphibianAuto類

speedmanuDate

getSpeed()wheelsNumtestTimegetWheelsNum()

speedmanuDate

getSpeed()draughtgetDraught()繼承自繼承自繼承自繼承自retractorTypegetType()ampAuto.Car::getSpeed();ampAuto.Ship::getSpeed();AmphibianAuto類并不是設(shè)想的樣子。數(shù)據(jù)冗余帶來的問題不光是內(nèi)存空間的浪費(fèi),更嚴(yán)重的是可能存在潛在的數(shù)據(jù)不一致問題。ampAuto.getSpeed();ampAuto.Conveyance::getSpeed();3.3.2虛基類虛基類:用于有共同基類的場合,解決多繼承時(shí)可能發(fā)生的對同一基類繼承多次而產(chǎn)生的二義性問題。它為最遠(yuǎn)的派生類提供唯一的一份虛基類成員,而不重復(fù)產(chǎn)生多次拷貝。

class

派生類名

:virtual繼承方式基類名

{

派生類新增成員的聲明 };設(shè)計(jì)類繼承關(guān)系時(shí),是在最開始處將共同基類設(shè)計(jì)為虛基類。對上例,只需修改Conveyance類為Car類和Ship類的虛基類,而AmphibianAuto類無須改動(dòng)。(例3_2)3.3.2虛基類帶虛基類的派生類構(gòu)造函數(shù)的不同之處:由虛基類直接或間接派生出的所有派生類都應(yīng)對虛基類初始化。對象生成時(shí),首先構(gòu)建虛基類部分,再是其他基類部分(這些基類構(gòu)建時(shí)會(huì)忽略掉對虛基類的構(gòu)建,從而保證虛基類部分只初始化一次),再是自己新增的成員。若包含多個(gè)虛基類,這些虛基類部分的構(gòu)造順序的規(guī)則為:(類層次上)從上到下、(同級時(shí),按聲明順序)從左到右。例3_2目錄3.1類的繼承與派生3.2派生類的構(gòu)造與析構(gòu)函數(shù)3.3二義性問題與虛基類3.4Qt自定義派生類3.5Qt中的界面3.6Qt常用部件3.4.1使用向?qū)?chuàng)建項(xiàng)目3.4.1使用向?qū)?chuàng)建項(xiàng)目3.4.1使用向?qū)?chuàng)建項(xiàng)目class

MyWidget

:

public

QWidget

{

QPushButton

btn;

on_btn_clicked();

...};int

main(int

argc,char*

argv[]){

QApplication

a(argc,argv);

QWidget

w;

QPushButton

btn(&w); ...}面向過程的思路面向?qū)ο蟮乃悸?.4.1使用向?qū)?chuàng)建項(xiàng)目mywidget.hmywidget.cpp3.4.1使用向?qū)?chuàng)建項(xiàng)目main.cpp3.4.1使用向?qū)?chuàng)建項(xiàng)目mywidget.cpp能否替換?3.4.2靜態(tài)創(chuàng)建對象和動(dòng)態(tài)創(chuàng)建對象的區(qū)別創(chuàng)建類對象的方式:靜態(tài)創(chuàng)建:使用“類名對象名;”的方式創(chuàng)建的類對象.進(jìn)入作用域時(shí)分配內(nèi)存超出作用域時(shí)系統(tǒng)自動(dòng)析構(gòu)并回收內(nèi)存空間。動(dòng)態(tài)創(chuàng)建:使用new運(yùn)算符申請并創(chuàng)建的類對象。內(nèi)存空間不會(huì)被自動(dòng)回收;需用delete釋放。mywidget.cpp╳和窗口同生存期的部件及對象,建議:定義為窗口類的成員對象。定義指針成員,在構(gòu)造函數(shù)中用new申請部件(或?qū)ο螅┛臻g,析構(gòu)函數(shù)中用delete釋放。3.4.3對象樹機(jī)制對象樹機(jī)制:窗口(或部件)被銷毀時(shí),所有以它為父對象、動(dòng)態(tài)創(chuàng)建的對象都會(huì)被自動(dòng)銷毀。實(shí)現(xiàn)原理:父對象中維護(hù)了一個(gè)children列表。父對象被銷毀前會(huì)根據(jù)children列表先銷毀它的所有子對象。不用寫3.4.4自定義信號和槽class類名:繼承權(quán)限父類名{

Q_OBJECT//類其它成員的聲明signals: 信號的聲明語句publicslots: 公有槽的聲明語句protectedslots: 保護(hù)槽的聲明語句privateslots: 私有槽的聲明語句};需是QObject類或是它的派生類必須有,且位于private區(qū)域應(yīng)放于頭文件中開始信號聲明開始槽聲明,需有訪問權(quán)限開始槽聲明,需有訪問權(quán)限開始槽聲明,需有訪問權(quán)限3.4.4自定義信號和槽1.自定義槽mywidget.hmywidget.cpp3.4.4自定義信號和槽2.取消關(guān)聯(lián)edit1->disconnect(SIGNAL(returnPressed()));edit1->disconnect(this);3.4.4自定義信號和槽3.自定義信號在上例的基礎(chǔ)上,考慮增加找彩蛋的功能:常規(guī)實(shí)現(xiàn)方式3.4.4自定義信號和槽3.自定義信號emit

信號名(實(shí)參列表);

3.4.4自定義信號和槽4.普通成員函數(shù)作為槽

此種形式關(guān)聯(lián)的槽不必用“slots:”聲明。QObject::connect(&發(fā)送對象,&類名::信號名,

&接收對象,&類型::槽名或普通成員函數(shù)名);目錄3.1類的繼承與派生3.2派生類的構(gòu)造與析構(gòu)函數(shù)3.3二義性問題與虛基類3.4Qt自定義派生類3.5Qt中的界面3.6Qt常用部件3.5.1命名空間命名空間:由用戶自己定義的空間域。namespace命名空間名{

實(shí)體的聲明和定義;}花括號中的實(shí)體可以是變量、常量、函數(shù)、結(jié)構(gòu)體、類、模板等??梢远x在項(xiàng)目中的多個(gè)地方,如果命名空間名相同,則自動(dòng)合并。可以嵌套定義,花括號中還可以是命名空間。定義在全局范圍內(nèi),不可以定義在函數(shù)中。3.5.1命名空間使用方式:嵌套時(shí):在某范圍內(nèi)需多次使用某命名空間時(shí):命名空間Myspace1嵌套的命名空間MyInterspace命名空間名::實(shí)體名外層命名空間名::內(nèi)層命名空間名::實(shí)體名usingnamespace命名空間名;3.5.2快速實(shí)現(xiàn)界面設(shè)計(jì)部件面板自定義窗口信號槽編輯器顯示子部件列表設(shè)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論