




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
VisualC++與面向?qū)ο蟪绦蛟O(shè)計(jì)教程第三部分面向?qū)ο?、類(lèi)和對(duì)象:數(shù)據(jù)和對(duì)應(yīng)操作封裝在一起2、繼承和派生:3、多態(tài)性面向?qū)ο蟮乃枷朊嫦蜻^(guò)程的程序設(shè)計(jì)(StructureProgramming)以功能為中心,采用函數(shù)來(lái)描述(動(dòng)詞)面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)面向?qū)ο蟪绦蛟O(shè)計(jì)方法認(rèn)為,客觀世界是由各種各樣的實(shí)體組成的,這些實(shí)體就是面向?qū)ο蠓椒ㄖ械膶?duì)象。消息是向某對(duì)象請(qǐng)求服務(wù)的一種表達(dá)方式對(duì)象之間的交互通過(guò)發(fā)送消息來(lái)實(shí)現(xiàn)。消息包括:目標(biāo)對(duì)象,請(qǐng)求的方法,參數(shù)面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)四個(gè)基本特征:抽象(類(lèi))(數(shù)據(jù)抽象+代碼抽象)封裝(過(guò)程和數(shù)據(jù)封藏起來(lái))繼承(基類(lèi)和派生類(lèi))多態(tài)性(虛函數(shù)、函數(shù)重載)OOP的優(yōu)點(diǎn)開(kāi)發(fā)時(shí)間短,效率高,可靠性高,所開(kāi)發(fā)的程序更強(qiáng)壯重用,共享,可維護(hù)性,精簡(jiǎn)適合于大程序長(zhǎng)時(shí)間的開(kāi)發(fā)工作類(lèi)與對(duì)象類(lèi)的聲明類(lèi)的定義成員函數(shù)的定義數(shù)據(jù)成員的定義對(duì)象的引用對(duì)象作函數(shù)的參數(shù)對(duì)象作函數(shù)的返回值為什么要引入類(lèi)工資單:姓名、單位、編號(hào).....成績(jī)單:姓名、學(xué)號(hào)、各科成績(jī).....簡(jiǎn)單數(shù)據(jù)單元無(wú)法將這樣記錄作為一個(gè)數(shù)據(jù)單位處理一一對(duì)應(yīng)關(guān)系以工資單為例月份工號(hào)姓名工作部門(mén)工作時(shí)間基本工資2002.90002張三西安交大1990.7.11000校內(nèi)津貼崗位津貼水電費(fèi)房租實(shí)發(fā)工資200300501501300類(lèi)的層次關(guān)系工作部門(mén):字符串姓名:字符串職務(wù):代碼(0~99)int工作時(shí)間:年(xxxx):int月(1~12):char日(1~31):char家庭情況婚否:(0,1)int是否是雙職工:int基本工資:double崗位津貼:double勞保福利:double獨(dú)生子女:double房租:double電費(fèi):double水費(fèi):double取暖費(fèi):double保育費(fèi):double實(shí)發(fā)工資:double類(lèi)(Class)----數(shù)據(jù)類(lèi)型類(lèi)是具有相同屬性和相同的方法的對(duì)象的集合,它是一種既包含數(shù)據(jù)又包含函數(shù)的抽象數(shù)據(jù)類(lèi)型。類(lèi)是將一類(lèi)對(duì)象和其他對(duì)象區(qū)別開(kāi)來(lái)的一組描述。類(lèi)是對(duì)象集合的抽象,對(duì)象是類(lèi)的一個(gè)實(shí)例。類(lèi)的種類(lèi) 用struct關(guān)鍵字聲明的類(lèi) 用union關(guān)鍵字聲明的類(lèi) 用class關(guān)鍵字聲明的類(lèi)類(lèi)的定義1.?dāng)?shù)據(jù)成員(DataMember),即類(lèi)的屬性;2.成員函數(shù)(MemberFunction),即類(lèi)的方法;3.構(gòu)造函數(shù)(constructor)和析構(gòu)函數(shù)(destructor),這將在7.4節(jié)介紹;4.運(yùn)算符函數(shù),在第9章介紹。對(duì)象(Object)----數(shù)據(jù)對(duì)象是包含現(xiàn)實(shí)世界物體特征的抽象實(shí)體,反映了系統(tǒng)為之保存信息和(或)與之交互的能力。對(duì)象=數(shù)據(jù)+作用于這些數(shù)據(jù)上的操作
=屬性(Attribute)+方法(Method)消息(Message)----函數(shù)調(diào)用消息是向某對(duì)象請(qǐng)求服務(wù)的一種表達(dá)方式。對(duì)象之間通過(guò)傳遞消息來(lái)實(shí)現(xiàn)相互的通信。類(lèi)的定義
class<類(lèi)名>
{
private:
//私有成員
<數(shù)據(jù)成員或成員函數(shù)表>;
public:
//公有成員
<數(shù)據(jù)成員或成員函數(shù)表>;
protected:
//保護(hù)成員
<數(shù)據(jù)成員或成員函數(shù)表>;
……};分析:編寫(xiě)簡(jiǎn)單的人事系統(tǒng)(子程序)人工作部門(mén)姓名出生日期職務(wù)工資基本工資崗位津貼……定義一個(gè)Person類(lèi),用來(lái)說(shuō)明人員類(lèi)對(duì)象//Example7-1:定義Person類(lèi)classPerson{private: char m_strName[20]; int m_nAge; int m_nSex;public: void Register(char*name,intage,charsex); char* GetName(); int GetAge(); char GetSex(); void ShowMe();};成員函數(shù)的定義成員函數(shù)的一般形式:<類(lèi)型><類(lèi)名>::<函數(shù)名>(<參數(shù)表>){<函數(shù)體>}編寫(xiě)Person類(lèi)成員函數(shù)的定義。//Example7-2:Person類(lèi)成員函數(shù)的定義voidPerson::Register(char*name,intage,charsex){ strcpy(m_strName,name); m_nAge=age; m_nSex=(sex=='m'?0:1);}char*Person::GetName(){ returnm_strName;}intPerson::GetAge(){ returnm_nAge;}charPerson::GetSex(){ return(m_nSex==0?'m':'f');}voidPerson::ShowMe(){ cout<<GetName()<<'\t'<<GetAge()<<'\t'<<GetSex()<<endl;}對(duì)象的引用說(shuō)明對(duì)象的一般形式(類(lèi)的實(shí)例化):
<類(lèi)名><對(duì)象1>,<對(duì)象2>,…對(duì)類(lèi)成員的訪問(wèn)
.
運(yùn)算符
->
運(yùn)算符Person對(duì)象的引用成員函數(shù)訪問(wèn)同類(lèi)中的數(shù)據(jù)成員(公有和私有)在對(duì)象外訪問(wèn)其數(shù)據(jù)成員或成員函數(shù)需使用運(yùn)算符“.”訪問(wèn)對(duì)象的成員
禁止直接訪問(wèn)一個(gè)對(duì)象中的私有成員同類(lèi)對(duì)象之間可以整體賦值對(duì)象用作函數(shù)的參數(shù)時(shí)屬于賦值調(diào)用;函數(shù)可以返回一個(gè)對(duì)象。
例如:Personperson1,person2;
int
nage=person1.GetAge();person1=person2;Person*p;p=newPerson;nage=p->GetAge();完整的人事資料輸入輸出程序。//Example7-3:人事資料的輸入和輸出voidmain(){ charname[20],sex;intage;Personperson1,person2; cout<<"Enteraperson'sname,ageandsex:"; cin>>name>>age>>sex; person1.Register(name,age,sex); cout<<"person1:\t";person1.ShowMe(); person1.Register("Zhang3",19,'m'); cout<<"person1:\t";person1.ShowMe(); person2=person1; //對(duì)象之間的賦值
cout<<"person2:\t";person2.ShowMe();}多文件結(jié)構(gòu)按照WINDOWS程序多文件的特點(diǎn),將其改造成多文件結(jié)構(gòu)通常將類(lèi)的定義放在頭文件中,成員函數(shù)的實(shí)現(xiàn)放在類(lèi)對(duì)應(yīng)的CPP文件中;然后通過(guò)#include的包含關(guān)系將多文件聯(lián)系起來(lái)。內(nèi)聯(lián)成員函數(shù)classPerson{private: charm_strName[20]; intm_nAge;intm_nSex;public: void Register(char*name,intage,charsex) { strcpy(m_strName,name); m_nAge=age; m_nSex=(sex=='m'?0:1); } char* GetName() { returnm_strName; } int GetAge() { returnm_nAge; } charGetSex() { return(m_nSex==0?'m':'f');}};構(gòu)造函數(shù)與析構(gòu)函數(shù)構(gòu)造函數(shù)(Constructor)定義了創(chuàng)建對(duì)象的方法,提供了初始化對(duì)象的一種簡(jiǎn)便手段。
與構(gòu)造函數(shù)相對(duì)應(yīng),析構(gòu)函數(shù)(Destructor)用于撤消一個(gè)對(duì)象。
構(gòu)造函數(shù)(Constructor)格式:
<類(lèi)名>(<參數(shù)表>);注意事項(xiàng):構(gòu)造函數(shù)必須與類(lèi)名相同構(gòu)造函數(shù)沒(méi)有返回值其功能是對(duì)對(duì)象進(jìn)行初始化,一般由一系列賦值語(yǔ)句構(gòu)成由系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)(Destructor)格式為:
<類(lèi)名>::~<類(lèi)名>();注意事項(xiàng):函數(shù)名與類(lèi)名相同,只是在前邊加“~”符號(hào)析構(gòu)函數(shù)不得返回任何值析構(gòu)函數(shù)不得帶有任何參數(shù)其功能是釋放對(duì)象成員所占用的存儲(chǔ),一般由一系列的delete組成由系統(tǒng)自動(dòng)調(diào)用為類(lèi)Person增加構(gòu)造函數(shù)和析構(gòu)函數(shù)。classPerson{Private: charm_strName[20];int m_nAge; int m_nSex;public: person(constchar*name,intage,charsex)//構(gòu)造函數(shù)
{strcpy(m_strName,name);m_nAge=age; m_nSex=(sex==’m’?0:1);}voidRegister(char*Name,intAge,charSex);void GetName(char*Name);intGetAge();charGetSex();};數(shù)據(jù)成員的初始化1.在構(gòu)造函數(shù)的函數(shù)體中進(jìn)行初始化。2.在構(gòu)造函數(shù)的頭部初始化。3.混合初始化。4.拷貝構(gòu)造函數(shù)在構(gòu)造函數(shù)的函數(shù)體中初始化classPerson{ char m_strName[20];intm_nAge;intm_nSex;public: Person(){strcpy(m_strName,”XXX”);m_nAge=0;m_nSex=0;} Person(char*name,intage,charsex) { strcpy(m_strName,name);m_nAge=age;m_nSex=(sex=='m'?0:1); }}例如,當(dāng)遇到聲明
Personpersonl(“Zhang3”,19,‘f’); Personperson2=Person(“Zhang3”,19,‘f’);在構(gòu)造函數(shù)的頭部初始化。其格式為:
<類(lèi)名>::<構(gòu)造函數(shù)>(<參數(shù)表>):<變量1>(<初值1>),…,<變量n>(<初值n>)
{ …… }例如Person::Person():m_nAge(0),m_nSex(0) { }混合初始化。例如Person::Person():m_nAge(0),m_nSex(0) { strcpy(m_strName,“XXX”); }拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù)例如Person(Person&p){ strcpy(m_strName,p.GetName()); m_nAge=p.GetAge(); m_nSex=(p.GetSex()=='m'?0:1);}Personpersonl(“Zhang3”,19,‘f’);Personperson2=Person(“Zhang3”,19,‘f’);對(duì)象與指針指向?qū)ο蟮闹羔?/p>
類(lèi)名*指針變量名表;
例: Personperson1(“Zhang3”,19,’f’); Person*ptr=&Person1; ptr->Speak();動(dòng)態(tài)存儲(chǔ)名字指針=new名字(名字初始化值);delete名字指針;例:Person*p=newPerson;deletep;this指針:指向該對(duì)象本身的指針MFC的CString類(lèi)(#include<afx.h>)賦值/連接運(yùn)算=、 +、+=比較運(yùn)算<、<=、==、Compare、CompareNoCase截取運(yùn)算Mid、Left、Right轉(zhuǎn)換運(yùn)算MakeUpper、MakeLower、MakeReverseCString類(lèi)(續(xù))查看字符信息
GetAt、GetLength、IsEmpty修改字符信息
SetAt、Insert、Delete格式化輸出
FormatCString類(lèi)舉例#include<iostream.h>#include<afx.h>voidmain(){ CStrings; s="123456789"; cout<<s<<endl; s.MakeReverse(); cout<<s<<endl; s.Format("s=%d",100); cout<<s<<endl;}MFC的CTime類(lèi)和CTimeSpan類(lèi)構(gòu)造函數(shù)
CTime、GetCurrentTime截取函數(shù)
GetYear、GetMonth、GetDay……轉(zhuǎn)換函數(shù)
Format……運(yùn)算符
=、+、-……CTime類(lèi)舉例#include<iostream.h>#include<afx.h>voidmain(){ CTimet; CStrings; t=CTime(1999,3,19,22,15,0); s=t.Format("%A,%B%d,%Y"); cout<<s<<endl; t=CTime::GetCurrentTime(); s=t.Format("%A,%B%d,%Y"); cout<<s<<endl;}CTimeSpan類(lèi)構(gòu)造函數(shù)CTimeSpan();CTimeSpan(constCTimeSpan&timeSpanSrc);CTimeSpan(LONGlDays,intnHours,intnMins,intnSecs);方法LONGGetDays(); //返回此CTimeSpan對(duì)象中的天數(shù)intGetHours(); //返回此CTimeSpan對(duì)象中的小時(shí)數(shù)intGetMinutes(); //返回此CTimeSpan對(duì)象中的分鐘數(shù)CTime類(lèi)和CTimeSpan類(lèi)的運(yùn)算= //賦一個(gè)新的時(shí)間值+,- //將CTime對(duì)象加上或減去一個(gè)CTimeSPan對(duì)象+=,-= //將CTime對(duì)象加上或減去一個(gè)CTimeSpan對(duì)象>,<,>=,<=,==,!= //比較兩個(gè)CTime對(duì)象舉例:CTimet1(2000,3,19,22,15,0);CTimet2(2000,3,20,22,15,0);CTimeSpants=t2-t1; //計(jì)算兩日期的間隔t2+=CTimeSpan(1,0,0,0);//在某日期上加一間隔類(lèi)的嵌套classEmployee{CString m_sDepartment; //工作部門(mén)
CString m_sName; //姓名
CTime m_tBirthdate; //出生日期
Position m_nPosition; //職務(wù)
CTime m_tDateOfWork; //參加工作時(shí)間
Salary m_Salary; //工資public:Employee(LPCTSTRlpszDepart,LPCTSTRlpszName,CTimetBirthdate,PositionnPosition,CTimetDateOfWork);//構(gòu)造函數(shù)
......}繼承和派生派生類(lèi)的定義格式為:class派生類(lèi)名:繼承方式基類(lèi)名1,繼承方式基類(lèi)名2,…,繼承方式基類(lèi)名n{
派生類(lèi)增加的成員聲明;};水果的分類(lèi)
派生類(lèi)的語(yǔ)法結(jié)構(gòu)class<派生類(lèi)名>:<訪問(wèn)權(quán)限><基類(lèi)名>{private:新增私有數(shù)據(jù)成員和成員函數(shù)protected:新增保護(hù)數(shù)據(jù)成員和成員函效public:新增公有數(shù)據(jù)成員和成員函效}派生類(lèi)中的變化
派生類(lèi)對(duì)基類(lèi)的擴(kuò)充派生類(lèi)對(duì)基類(lèi)成員的改造
系統(tǒng)的默認(rèn)值就是私有繼承(private)。
派生類(lèi)的繼承方式私有繼承private公有繼承public
保護(hù)繼承protected公有繼承(public) 公有繼承方式創(chuàng)建的派生類(lèi)對(duì)基類(lèi)各種成員訪問(wèn)權(quán)限如下:基類(lèi)公有成員相當(dāng)于派生類(lèi)的公有成員,即派生類(lèi)可以象訪問(wèn)自身公有成員一樣訪問(wèn)從基類(lèi)繼承的公有成員。
基類(lèi)保護(hù)成員相當(dāng)于派生類(lèi)的保護(hù)成員,即派生類(lèi)可以象訪問(wèn)自身的保護(hù)成員一樣,訪問(wèn)基類(lèi)的保護(hù)成員。
對(duì)于基類(lèi)的私有成員,派生類(lèi)內(nèi)部成員無(wú)法直接訪問(wèn)。派生類(lèi)使用者也無(wú)法通過(guò)派生類(lèi)對(duì)象直接訪問(wèn)。
實(shí)例:公有繼承(public)
classPerson{private: char m_strName[20]; intm_nAge; int m_nSex; public: void GetName(char*Name); int GetAge(); charGetSex(); ......};classEmployee:publicPerson{charm_sDepartment[21];charm_sPosition[21];floatm_fSalary;public:Employee(){}voidSetDepartment(constchar*);voidSetSalary(float);char*GetPosition()const;floatGetSalary()const;......};從Person類(lèi)公有派生一個(gè)職員類(lèi)
classEmployee:publicPerson{ charm_strDept[20]; floatm_fSalary;public: Employee() {EmployeeRegister("XXX",0,'m',"XXX",0);} EmployeeRegister(char*name,intage,charsex,char*dept,floatsalary); voidShowMe();};私有繼承
(private)派生類(lèi)對(duì)基類(lèi)各種成員訪問(wèn)權(quán)限如下:基類(lèi)公有成員和保護(hù)成員都相當(dāng)于派生類(lèi)的私有成員,派生類(lèi)只能通過(guò)自身的函數(shù)成員訪問(wèn)他們
對(duì)于基類(lèi)的私有成員,無(wú)論派生類(lèi)內(nèi)部成員或派生類(lèi)使用者都無(wú)法直接訪問(wèn)。
實(shí)例:私有繼承(private)
classPerson{private: char m_strName[20]; intm_nAge; int m_nSex; public: void GetName(char*Name); int GetAge(); charGetSex(); ......};classEmployee:privatePerson{charm_sDepartment[21];charm_sPosition[21];floatm_fSalary;public:Employee(){}voidSetDepartment(constchar*);voidSetSalary(float);char*GetPosition()const;floatGetSalary()const;......};人員類(lèi)(Person)的私有派生類(lèi)classEmployee:privatePerson //雇員類(lèi)定義{ charm_strDept[20]; //工作部門(mén)
floatm_fSalary; //月薪public: Employee() {EmployeeRegister("XXX",0,'m',"XXX",0);} EmployeeRegister(char*name,intage,charsex,char*dept,floatsalary); voidShowMe(); //顯示雇員信息
char*GetEmployeeName() {return GetName();}//取姓名
charGetEmployeeSex() {return GetSex();}//取性別
intGetEmployeeAge() {return GetAge();}//取年齡};保護(hù)繼承(public) 保護(hù)繼承方式創(chuàng)建的派生類(lèi)對(duì)基類(lèi)各種成員訪問(wèn)權(quán)限如下:基類(lèi)的公有成員和保護(hù)成員都相當(dāng)于派生類(lèi)的保護(hù)成員,派生類(lèi)可以通過(guò)自身的成員函數(shù)或其子類(lèi)的成員函數(shù)訪問(wèn)他們對(duì)于基類(lèi)的私有成員,無(wú)論派生類(lèi)內(nèi)部成員或派生類(lèi)使用者都無(wú)法直接訪問(wèn)派生類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類(lèi)構(gòu)造函數(shù)的一般形式為: 派生類(lèi)名::派生類(lèi)名(參數(shù)總表):基類(lèi)名1(參數(shù)表1),…,基類(lèi)名n(參數(shù)表n), 內(nèi)嵌對(duì)象名1(對(duì)象參數(shù)表1),…,內(nèi)嵌對(duì)象名m(對(duì)象參數(shù)表m)
{
派生類(lèi)新增加成員的初始化;
}派生類(lèi)與基類(lèi)的析構(gòu)函數(shù)沒(méi)有什么聯(lián)系,彼此獨(dú)立,派生類(lèi)或基類(lèi)的析構(gòu)函數(shù)只作各自類(lèi)對(duì)象消亡前的善后工作
派生類(lèi)構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行
classPerson{ char m_strName[10]; int m_nAge;public: Person(char*name,intage) { strcpy(m_strName,name); m_nAge=age; cout<<"constructorofperson"<<m_strName<<endl; } ~Person() {cout<<"deconstrutorofperson"<<m_strName<<endl;}};派生類(lèi)構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行classEmployee:publicPerson{ char m_strDept[20]; PersonWang;public: Employee(char*name,intage,char*dept,char*name1,intage1) :Person(name,age),Wang(name1,age1) { strcpy(m_strDept,dept); cout<<"constructorofEmployee"<<endl; } ~Employee(){cout<<"deconstrucorofEmployee"<<endl;}};派生類(lèi)構(gòu)造函數(shù)的執(zhí)行次序首先,調(diào)用基類(lèi)構(gòu)造函數(shù),調(diào)用順序按照它們被繼承時(shí)聲明的基類(lèi)名順序執(zhí)行。其次,調(diào)用內(nèi)嵌對(duì)象構(gòu)造函數(shù),調(diào)用次序按各個(gè)對(duì)象在派生類(lèi)內(nèi)聲明的順序。最后,執(zhí)行派生類(lèi)構(gòu)造函數(shù)體中的內(nèi)容。析構(gòu)函數(shù)派生類(lèi)析構(gòu)函數(shù)執(zhí)行過(guò)程恰與構(gòu)造函數(shù)執(zhí)行過(guò)程相反。首先執(zhí)行派生類(lèi)析構(gòu)函數(shù)然后執(zhí)行內(nèi)嵌對(duì)象的析構(gòu)函數(shù)最后執(zhí)行基類(lèi)析構(gòu)函數(shù)類(lèi)模版
template<class<類(lèi)型參數(shù)>> class<類(lèi)名> { …… };多態(tài)性含義實(shí)現(xiàn)“一種接口,多種方法”的技術(shù)某類(lèi)的對(duì)象在接受同樣的消息時(shí),做出不同的響應(yīng)多態(tài)性的形式編譯時(shí)多態(tài)性
編譯器對(duì)源程序進(jìn)行編譯時(shí)就可以確定所調(diào)用的是哪一個(gè)函數(shù),編譯時(shí)多態(tài)性通過(guò)重載來(lái)實(shí)現(xiàn);函數(shù)重載運(yùn)算符重載運(yùn)行時(shí)多態(tài)性
在程序運(yùn)行過(guò)程中根據(jù)具體情況來(lái)確定調(diào)用的是哪一個(gè)函數(shù);虛函數(shù)編譯時(shí)多態(tài)性——函數(shù)重載(兔子逃生)class兔子{public:
……void逃生(老鷹a){“兔子蹬鷹”;}void逃生(狼
b){“動(dòng)如脫兔”;}……};
運(yùn)行時(shí)多態(tài)性——虛函數(shù)(catordog???)class寵物{public:voidchar*speak(){cout<<"zzz";};
…};class貓:public寵物{public:voidchar*speak(){cout<<"miao!miao!";}
…};class狗:public寵物{public:voidchar*speak(){cout<<"wang!wang!";}
…};例:catordog???(續(xù))voidmain(){ ……
寵物*p;//p為寵物類(lèi)指針
貓
cat1; //定義貓類(lèi)對(duì)象
狗
dog1; //定義狗類(lèi)對(duì)象……根據(jù)用戶輸入將貓或狗對(duì)象地址賦給p指針,例如用戶輸入1,則執(zhí)行p=&cat1;用戶輸入2,則執(zhí)行p=&dog1;……p->speak();
……}
派生類(lèi)對(duì)象替換基類(lèi)對(duì)象
原則:凡是基類(lèi)對(duì)象出現(xiàn)的場(chǎng)合都可以用公有派生類(lèi)對(duì)象取代
形式
(1)派生類(lèi)對(duì)象給基類(lèi)對(duì)象賦值(2)派生類(lèi)對(duì)象可以初始化基類(lèi)對(duì)象的引用(3)可以令基類(lèi)對(duì)象的指針指向派生類(lèi)對(duì)象,即將派生類(lèi)對(duì)象的地址傳遞給基類(lèi)指針
例:派生類(lèi)對(duì)象替換基類(lèi)對(duì)象
#include<iostream.h>classPet //基類(lèi){public: voidSpeak() {cout<<"Howdoesapetspeak?"<<endl;}};classCat:publicPet //派生類(lèi){public: voidSpeak() {cout<<"miao!miao!"<<endl;}};例:派生類(lèi)對(duì)象替換基類(lèi)對(duì)象(續(xù)一)classDog:publicPet //派生類(lèi){public: voidSpeak() {cout<<"wang!wang!"<<endl;}};voidmain(){ Pet *p1,*p2,*p3,obj; //基類(lèi)對(duì)象指針p1,基類(lèi)對(duì)象obj Dogdog1; Catcat1; obj=dog1; //用Dog類(lèi)對(duì)象給Pet類(lèi)對(duì)象賦值
obj.Speak(); 派生類(lèi)對(duì)象替換基類(lèi)對(duì)象(續(xù)二)
p1=&cat1; //用Cat類(lèi)對(duì)象地址給基類(lèi)指針賦值
p1->Speak(); p1=&dog1; //用Dog類(lèi)對(duì)象地址給基類(lèi)指針賦值
p1->Speak(); p2=newCat; //動(dòng)態(tài)生成Cat類(lèi)對(duì)象
p2->Speak(); p3=newDog; //動(dòng)態(tài)生成Dog類(lèi)對(duì)象
p3->Speak(); Pet &p4=cat1; //以Cat類(lèi)對(duì)象初始化Pet類(lèi)引用
p4.Speak();}
虛函數(shù)
定義:在某基類(lèi)中聲明為virtual并在一個(gè)或多個(gè)派生類(lèi)中被重新定義的成員函數(shù)
語(yǔ)法:virtual函數(shù)返回類(lèi)型
函數(shù)名(參數(shù)表){
函數(shù)體}用途:實(shí)現(xiàn)多態(tài)性,通過(guò)指向派生類(lèi)的基類(lèi)指針,訪問(wèn)派生類(lèi)中同名覆蓋成員函數(shù),
虛函數(shù)實(shí)現(xiàn)多態(tài)性#include<iostream.h>classPet //基類(lèi){public:
virtualvoidSpeak() {cout<<"Howdoesapetspeak?"<<endl;}};classCat:publicPet //派生類(lèi)
{public:
virtualvoidSpeak() {cout<<"miao!miao!"<<endl;}};虛函數(shù)的使用限制應(yīng)通過(guò)指針或引用調(diào)用虛函數(shù),而不要以對(duì)象名調(diào)用虛函數(shù)說(shuō)明語(yǔ)句在派生類(lèi)中重定義的基類(lèi)虛函數(shù)仍為虛函數(shù),同時(shí)可以省略virtual關(guān)鍵字
不能定義虛構(gòu)造函數(shù),可以定義虛析構(gòu)函數(shù)
抽象類(lèi)純虛函數(shù)
virtual返回類(lèi)型
函數(shù)名(參數(shù)表)=0
純虛函數(shù)是為了實(shí)現(xiàn)多態(tài)性而存在,具體實(shí)現(xiàn)只能在派生類(lèi)中完成。抽象類(lèi)
至少包含一個(gè)純虛函數(shù)的類(lèi)稱(chēng)為抽象類(lèi)
抽象類(lèi)為其所有子類(lèi)提供了統(tǒng)一的操作界面,使其派生類(lèi)具有一系列統(tǒng)一的方法。
抽象類(lèi)的使用要求
抽象類(lèi)不能實(shí)例化抽象類(lèi)只作為基類(lèi)被繼承可以定義指向抽象類(lèi)的指針或引用
抽象寵物類(lèi)的實(shí)現(xiàn)#include<iostream.h>#include<string.h>classPet //基類(lèi){ char m_strName[20]; int m_nAge; char m_strColor[12];public: char m_strType[10]; Pet(char*,int,char*); char*GetName() {returnm_strName;} int GetAge() {returnm_nAge;} char*GetColor() {returnm_strColor;} virtualvoidSpeak()=0; virtualvoidGetInfo(){}};抽象寵物類(lèi)的實(shí)現(xiàn)(續(xù)1)Pet::Pet(char*name,intage,char*color){ strcpy(m_strName,name); m_nAge=age; strcpy(m_strColor,color); strcpy(m_strType,"pet");}抽象寵物類(lèi)的實(shí)現(xiàn)(續(xù)2)classCat:publicPet //派生類(lèi)
{public: Cat(char*name,intage,char*color):Pet(name,age,color){} voidSpeak() {cout<<"Soundofspeak:miao!miao!"<<endl<<endl;} voidGetInfo();};voidCat::GetInfo(){ cout<<"Thecat'sname:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025湖北省建筑安全員知識(shí)題庫(kù)附答案
- 成都農(nóng)業(yè)科技職業(yè)學(xué)院《創(chuàng)客教育》2023-2024學(xué)年第二學(xué)期期末試卷
- 無(wú)錫太湖學(xué)院《高級(jí)日語(yǔ)3》2023-2024學(xué)年第二學(xué)期期末試卷
- 武漢工程職業(yè)技術(shù)學(xué)院《體育產(chǎn)業(yè)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東省外語(yǔ)藝術(shù)職業(yè)學(xué)院《創(chuàng)新設(shè)計(jì)與實(shí)踐》2023-2024學(xué)年第二學(xué)期期末試卷
- 長(zhǎng)春工程學(xué)院《稅法(下)》2023-2024學(xué)年第二學(xué)期期末試卷
- 青海交通職業(yè)技術(shù)學(xué)院《小學(xué)科學(xué)教學(xué)法》2023-2024學(xué)年第二學(xué)期期末試卷
- 烏海職業(yè)技術(shù)學(xué)院《人工智能教育應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 黑龍江工程學(xué)院昆侖旅游學(xué)院《主流輿情智能分析實(shí)踐》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南工程學(xué)院《科技文獻(xiàn)檢索(醫(yī)科)》2023-2024學(xué)年第二學(xué)期期末試卷
- 新媒體運(yùn)營(yíng)合作合同范本
- 2024年12月2025中央統(tǒng)戰(zhàn)部直屬事業(yè)單位應(yīng)屆高校畢業(yè)生公開(kāi)招聘21人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 2025年中國(guó)主題樂(lè)園行業(yè)發(fā)展概況、市場(chǎng)全景分析及投資策略研究報(bào)告
- 產(chǎn)后疼痛管理指南
- 工娛治療及其護(hù)理
- 人效管理措施
- 2024-2025學(xué)年人教部編版七年級(jí)上語(yǔ)文寒假作業(yè)(五)
- 四年級(jí)下冊(cè)勞動(dòng)《小小快遞站》課件
- 中國(guó)妊娠期糖尿病母兒共同管理指南(2024版)解讀
- 籃球教練職業(yè)生涯規(guī)劃
- 春節(jié)促銷(xiāo)活動(dòng)方案(7篇)
評(píng)論
0/150
提交評(píng)論