第九章 多態(tài)性及虛函數(shù)_第1頁(yè)
第九章 多態(tài)性及虛函數(shù)_第2頁(yè)
第九章 多態(tài)性及虛函數(shù)_第3頁(yè)
第九章 多態(tài)性及虛函數(shù)_第4頁(yè)
第九章 多態(tài)性及虛函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第9 9章運(yùn)算符重載與虛函數(shù)章運(yùn)算符重載與虛函數(shù)9.1 多態(tài)性的概念及其表現(xiàn)形式多態(tài)性的概念及其表現(xiàn)形式9.2 運(yùn)算符重載的規(guī)則與方式運(yùn)算符重載的規(guī)則與方式9.3 幾種典型運(yùn)算符的重載幾種典型運(yùn)算符的重載9.4類型轉(zhuǎn)換類型轉(zhuǎn)換9.5聯(lián)編與虛函數(shù)聯(lián)編與虛函數(shù)9.6純虛函數(shù)和抽象類純虛函數(shù)和抽象類多態(tài)性的概念及其表現(xiàn)形式顧名思義,多態(tài)的意思是一個(gè)事物有多種形態(tài)。從程序設(shè)顧名思義,多態(tài)的意思是一個(gè)事物有多種形態(tài)。從程序設(shè)計(jì)的角度看,通常指對(duì)于同一個(gè)消息、同一種調(diào)用,在不同的計(jì)的角度看,通常指對(duì)于同一個(gè)消息、同一種調(diào)用,在不同的場(chǎng)合,不同的情況下,執(zhí)行不同的行為。例如運(yùn)算符的重載和場(chǎng)合,不同的情況下

2、,執(zhí)行不同的行為。例如運(yùn)算符的重載和虛函數(shù)。虛函數(shù)。 多態(tài)性是指發(fā)出同樣的消息被不同類型的對(duì)象接收時(shí)導(dǎo)致多態(tài)性是指發(fā)出同樣的消息被不同類型的對(duì)象接收時(shí)導(dǎo)致完全不同的行為。完全不同的行為。 消息消息主要指對(duì)類的成員函數(shù)的調(diào)用。主要指對(duì)類的成員函數(shù)的調(diào)用。 C+ C+ 系統(tǒng)支持二種多態(tài)性:系統(tǒng)支持二種多態(tài)性:1.1.靜態(tài)多態(tài)性靜態(tài)多態(tài)性編譯時(shí)的多態(tài)性,其具體實(shí)現(xiàn)主要有:編譯時(shí)的多態(tài)性,其具體實(shí)現(xiàn)主要有:函數(shù)重載(詳見(jiàn)函數(shù)重載(詳見(jiàn)5.5.25.5.2,本章不再介紹)和運(yùn)算符重載,本章不再介紹)和運(yùn)算符重載2.2.動(dòng)態(tài)多態(tài)性動(dòng)態(tài)多態(tài)性運(yùn)行時(shí)的多態(tài)性,其具體實(shí)現(xiàn)主要有:運(yùn)行時(shí)的多態(tài)性,其具體實(shí)現(xiàn)主要有

3、:虛函數(shù)虛函數(shù)運(yùn)算符重載的方法運(yùn)算符重載的方法class Complex public:Complex( )real=0;imag=0; Complex(double r,double i) real=r;imag=i; Complex complex_add(Complex &c2); void display( ); private:double real; double imag;Complex Complex complex_add(Complex &c2)Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c; void

4、Complex display( ) cout(real,imagi)endl;int main( )Complex c1(3,4),c2(5,-10),c3; c3=plex_add(c2); coutc1=; c1.display( ); coutc2=; c2.display( ); coutc1+c2=; c3.display( ); return 0;Complex operator+(Complex c2);Complex Complex operator+(Complex c2) Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;

5、return c;* *,/,/如何實(shí)現(xiàn)如何實(shí)現(xiàn)c3=c1+c2;注注 意意H重載不能改變運(yùn)算符運(yùn)算對(duì)象重載不能改變運(yùn)算符運(yùn)算對(duì)象( (即操作數(shù)即操作數(shù)) )的個(gè)數(shù)。的個(gè)數(shù)。H重載運(yùn)算符的函數(shù)不能有默認(rèn)的參數(shù)重載運(yùn)算符的函數(shù)不能有默認(rèn)的參數(shù)H重載的運(yùn)算符必須和用戶定義的自定義類型的對(duì)象一重載的運(yùn)算符必須和用戶定義的自定義類型的對(duì)象一起使用,其參數(shù)至少應(yīng)有一個(gè)是類對(duì)象起使用,其參數(shù)至少應(yīng)有一個(gè)是類對(duì)象. .H用于類對(duì)象的運(yùn)算符一般必須重載,但有兩個(gè)例外,用于類對(duì)象的運(yùn)算符一般必須重載,但有兩個(gè)例外,運(yùn)算符運(yùn)算符“=”“=”和和“&”“&”不必用戶重載不必用戶重載int operator +(in

6、t a,int b)int operator +(int a,int b)return(a-b);return(a-b);運(yùn)算符重載函數(shù)作為類成員函數(shù)和友元函數(shù)運(yùn)算符重載函數(shù)作為類成員函數(shù)和友元函數(shù)class Complex public:Complex( )real=0;imag=0; Complex(double r,double i) real=r;imag=i; Complex operator+(Complex &c2);void display( ); private:double real; double imag;Complex Complex operator+(Comple

7、x &c2) Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c;void Complex display( ) cout(real,imagi)endl;int main( )Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=; c1.display( ); coutc2=; c2.display( ); coutc1+c2=; c3.display( ); return 0;friend Complex operator + (Complex c1,Complex c2);Comple

8、x operator + (Complex c1,Complex c2) /定義作為友元函數(shù)的重載函數(shù)定義作為友元函數(shù)的重載函數(shù)return Complex(c1.real+c2.real, c1.imag+c2.imag);兩者的區(qū)別兩者的區(qū)別c3=c2+i;Complex Complex operator+(int i) return Complex(real+i,imag);c3=i+c2;friend Complex operator+(int i,Complex c);Complex operator+(int i, Complex c) return Complex(i+c.rea

9、l,c.imag);無(wú)法調(diào)用無(wú)法調(diào)用i.operator+ 運(yùn)算符重載函數(shù)作為成員函數(shù)運(yùn)算符重載函數(shù)作為成員函數(shù), ,必須要求運(yùn)算表達(dá)式第一個(gè)必須要求運(yùn)算表達(dá)式第一個(gè)參數(shù)參數(shù)( (即運(yùn)算符左側(cè)的操作數(shù)即運(yùn)算符左側(cè)的操作數(shù)) )是一個(gè)類對(duì)象,而且與運(yùn)算符函是一個(gè)類對(duì)象,而且與運(yùn)算符函數(shù)的類型相同。數(shù)的類型相同。 將雙目運(yùn)算符重載為友元函數(shù)時(shí),在函數(shù)的形參表列中必將雙目運(yùn)算符重載為友元函數(shù)時(shí),在函數(shù)的形參表列中必須有兩個(gè)參數(shù),不能省略,不要求第一個(gè)參數(shù)必須為類對(duì)象。須有兩個(gè)參數(shù),不能省略,不要求第一個(gè)參數(shù)必須為類對(duì)象。例例66 55 4433 22 1117 16 1514 13 1283 71

10、5947 35 23+=class Matrix public: Matrix(); friend Matrix operator+(Matrix &,Matrix &); void input(); void display(); private: int mat23; ;Matrix:Matrix() for(int i=0;i2;i+) for(int j=0;j3;j+) matij=0;Matrix operator+(Matrix &a,Matrix &b) Matrix c; for(int i=0;i2;i+) for(int j=0;j3;j+) c.matij=a.mati

11、j+b.matij; return c; void Matrix:input() for(int i=0;i2;i+) for(int j=0;jmatij;void Matrix:display() for (int i=0;i2;i+) for(int j=0;j3;j+) coutmatij ; coutendl;void main()Matrix a,b,c; a.input(); b.input();a.display();b.display(); c=a+b; c.display();華華 東東 交交 通通 大大 學(xué)學(xué) 信信 息息 工工 程程 學(xué)學(xué) 院院重載單目運(yùn)算符重載單目運(yùn)算符

12、重載流插入運(yùn)算符和流提取運(yùn)算符重載流插入運(yùn)算符和流提取運(yùn)算符 用戶自己定義的類型的數(shù)據(jù),是用戶自己定義的類型的數(shù)據(jù),是不能不能直接用直接用“”來(lái)輸出和輸入的。來(lái)輸出和輸入的。 對(duì)對(duì)“”重載的函數(shù)形式如下:重載的函數(shù)形式如下: istream & operator (istream &,自定義類自定義類 &);ostream & operator ”“”的函數(shù)的第一個(gè)參數(shù)和函數(shù)的的函數(shù)的第一個(gè)參數(shù)和函數(shù)的類型都必須是類型都必須是istream&istream&類型類型; ; 只能將重載只能將重載“”“”和和“”“”的函數(shù)作為友元函數(shù)的函數(shù)作為友元函數(shù)或普通的函數(shù),而不能將它們定義為成員函數(shù)。或普

13、通的函數(shù),而不能將它們定義為成員函數(shù)。class Complex public:Complex( )real=0;imag=0; Complex(double r,double i) real=r;imag=i; Complex operator+(Complex &c2);friend ostream& operator (ostream&,Complex&);void display( ); private:double real; double imag;Complex Complex operator+(Complex &c2) return Complex(real+c2.real,

14、imag+c2.imag); void Complex display( ) cout (real,imagi) endl;ostream& operator (ostream& output,Complex& c) output (c.real+c.imagi) endl; return output;int main( )Complex c1(2,4),c2(6,10),c3;c3=c1+c2;coutc3;return 0;例例 coutc3c2;(coutc3)c2;coutc35endl;信息工程學(xué)院計(jì)算機(jī)應(yīng)用教研室為什么運(yùn)算符為什么運(yùn)算符“”“”重載函數(shù)返回類型是引用重載函數(shù)返回類

15、型是引用coutc3c2;coutc3c2;相當(dāng)于相當(dāng)于operator (operator (cout,c3),c2)operator (operator (cout,c3),c2) 無(wú)論函數(shù)返回的是什么無(wú)論函數(shù)返回的是什么, ,它都會(huì)成為下一個(gè)運(yùn)算符的左它都會(huì)成為下一個(gè)運(yùn)算符的左邊的參數(shù)邊的參數(shù), ,返回返回coutcout的當(dāng)前值以便連續(xù)的輸出的當(dāng)前值以便連續(xù)的輸出. .信息工程學(xué)院計(jì)算機(jī)應(yīng)用教研室聯(lián)編與虛函數(shù)聯(lián)編與虛函數(shù) 聯(lián)編也稱綁定,是指源程序在編譯后生成的可執(zhí)行代聯(lián)編也稱綁定,是指源程序在編譯后生成的可執(zhí)行代碼經(jīng)過(guò)連接裝配在一起的過(guò)程,即是指計(jì)算機(jī)程序自身彼碼經(jīng)過(guò)連接裝配在一起的過(guò)

16、程,即是指計(jì)算機(jī)程序自身彼此關(guān)聯(lián)的過(guò)程,此關(guān)聯(lián)的過(guò)程, 按聯(lián)編工作來(lái)分:按聯(lián)編工作來(lái)分:1. 1. 靜態(tài)聯(lián)編:聯(lián)編工作在編譯連接階段完成。靜態(tài)聯(lián)編:聯(lián)編工作在編譯連接階段完成。2. 2. 動(dòng)態(tài)聯(lián)編:聯(lián)編在程序運(yùn)行階段完成。動(dòng)態(tài)聯(lián)編:聯(lián)編在程序運(yùn)行階段完成。虛函數(shù)引例虛函數(shù)引例#include class A public:void display()couttA:display()endl; ;class B: public A public:void display()couttB:display()endl; ;class C: public B public:void display()

17、couttC:display()display();void main()A a;B b;C c;A *p;p=&a;fun(p);p=&b;fun(p);p=&c;fun(p);運(yùn)行結(jié)果:運(yùn)行結(jié)果: A:display() A:display() A:display()?虛函數(shù)虛函數(shù)H H 虛函數(shù)的作用是允許在派生類中重新定義虛函數(shù)的作用是允許在派生類中重新定義與基類同名的函數(shù),并且可以通過(guò)基類指針與基類同名的函數(shù),并且可以通過(guò)基類指針或引用來(lái)訪問(wèn)基類和派生類中的同名函數(shù)?;蛞脕?lái)訪問(wèn)基類和派生類中的同名函數(shù)。H H 程序中不是通過(guò)不同的對(duì)象名去調(diào)用不同程序中不是通過(guò)不同的對(duì)象名去調(diào)用不同派

18、生層次中的同名函數(shù),而是通過(guò)指針調(diào)用派生層次中的同名函數(shù),而是通過(guò)指針調(diào)用它們。它們。H H 虛函數(shù)是動(dòng)態(tài)聯(lián)編的基礎(chǔ)虛函數(shù)是動(dòng)態(tài)聯(lián)編的基礎(chǔ), 虛函數(shù)是非靜態(tài)虛函數(shù)是非靜態(tài)的成員函數(shù)的成員函數(shù)#include class B0 public:virtual void display()coutB0:display()endl;class B1: public B0 public: void display() coutB1:display()endl; ;class D1: public B1 public: void display() coutD1:display()display(); v

19、oid main() B0 b0, *p; B1 b1; D1 d1; p=&b0;fun(p); p=&b1;fun(p); p=&d1;fun(p);虛函數(shù)的定義虛函數(shù)的定義virtual () 即在類的說(shuō)明中,在函數(shù)原型之前加即在類的說(shuō)明中,在函數(shù)原型之前加virtual。注意:注意: virtual 只用在類定義的原型說(shuō)明中,不能用在函數(shù)只用在類定義的原型說(shuō)明中,不能用在函數(shù)實(shí)現(xiàn)中。實(shí)現(xiàn)中。 具有繼承性,基類中定義了虛函數(shù),派生類中無(wú)論是具有繼承性,基類中定義了虛函數(shù),派生類中無(wú)論是否說(shuō)明,否說(shuō)明,同原型同原型函數(shù)都自動(dòng)為虛函數(shù)。函數(shù)都自動(dòng)為虛函數(shù)。 本質(zhì):不是重載定義而是覆蓋定義。本質(zhì):不是重載定義而是覆蓋定義。 調(diào)用方式:通過(guò)調(diào)用方式:通過(guò)基類指針或引用基類指針或引用,執(zhí)行時(shí)會(huì)根據(jù),執(zhí)行時(shí)會(huì)根據(jù)指針指針指向的對(duì)象的類指向的對(duì)象的類,決定調(diào)用哪個(gè)函數(shù)。,決定調(diào)用哪個(gè)函數(shù)。 只能用只能用virtual聲明類的成員函數(shù),使它成為虛函數(shù),聲明類的成員函數(shù),使它成為虛函數(shù),而不能將類外的普通函數(shù)聲明為虛函數(shù)而不能將類外的普通函數(shù)聲明為虛函數(shù)純虛函數(shù)與抽象類純虛函數(shù)與抽象類H H H H H H 抽象類:不用來(lái)定義對(duì)象而只作為一種基本類型用作抽象類:不用來(lái)定義對(duì)象而只作為一種基本類型用作繼承的類。繼承的類。H H #include class B0 publ

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論