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

下載本文檔

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

文檔簡介

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

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

3、:虛函數(shù)虛函數(shù)運算符重載的方法運算符重載的方法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;* *,/,/如何實現(xiàn)如何實現(xiàn)c3=c1+c2;注注 意意H重載不能改變運算符運算對象重載不能改變運算符運算對象( (即操作數(shù)即操作數(shù)) )的個數(shù)。的個數(shù)。H重載運算符的函數(shù)不能有默認的參數(shù)重載運算符的函數(shù)不能有默認的參數(shù)H重載的運算符必須和用戶定義的自定義類型的對象一重載的運算符必須和用戶定義的自定義類型的對象一起使用,其參數(shù)至少應(yīng)有一個是類對象起使用,其參數(shù)至少應(yīng)有一個是類對象. .H用于類對象的運算符一般必須重載,但有兩個例外,用于類對象的運算符一般必須重載,但有兩個例外,運算符運算符“=”“=”和和“&”“&”不必用戶重載不必用戶重載int operator +(in

6、t a,int b)int operator +(int a,int b)return(a-b);return(a-b);運算符重載函數(shù)作為類成員函數(shù)和友元函數(shù)運算符重載函數(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);無法調(diào)用無法調(diào)用i.operator+ 運算符重載函數(shù)作為成員函數(shù)運算符重載函數(shù)作為成員函數(shù), ,必須要求運算表達式第一個必須要求運算表達式第一個參數(shù)參數(shù)( (即運算符左側(cè)的操作數(shù)即運算符左側(cè)的操作數(shù)) )是一個類對象,而且與運算符函是一個類對象,而且與運算符函數(shù)的類型相同。數(shù)的類型相同。 將雙目運算符重載為友元函數(shù)時,在函數(shù)的形參表列中必將雙目運算符重載為友元函數(shù)時,在函數(shù)的形參表列中必須有兩個參數(shù),不能省略,不要求第一個參數(shù)必須為類對象。須有兩個參數(shù),不能省略,不要求第一個參數(shù)必須為類對象。例例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é) 院院重載單目運算符重載單目運算符

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

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é)院計算機應(yīng)用教研室為什么運算符為什么運算符“”“”重載函數(shù)返回類型是引用重載函數(shù)返回類

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

16、程,即是指計算機程序自身彼此關(guān)聯(lián)的過程,此關(guān)聯(lián)的過程, 按聯(lián)編工作來分:按聯(lián)編工作來分:1. 1. 靜態(tài)聯(lián)編:聯(lián)編工作在編譯連接階段完成。靜態(tài)聯(lián)編:聯(lián)編工作在編譯連接階段完成。2. 2. 動態(tài)聯(lián)編:聯(lián)編在程序運行階段完成。動態(tài)聯(lián)編:聯(liá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);運行結(jié)果:運行結(jié)果: A:display() A:display() A:display()?虛函數(shù)虛函數(shù)H H 虛函數(shù)的作用是允許在派生類中重新定義虛函數(shù)的作用是允許在派生類中重新定義與基類同名的函數(shù),并且可以通過基類指針與基類同名的函數(shù),并且可以通過基類指針或引用來訪問基類和派生類中的同名函數(shù)?;蛞脕碓L問基類和派生類中的同名函數(shù)。H H 程序中不是通過不同的對象名去調(diào)用不同程序中不是通過不同的對象名去調(diào)用不同派

18、生層次中的同名函數(shù),而是通過指針調(diào)用派生層次中的同名函數(shù),而是通過指針調(diào)用它們。它們。H H 虛函數(shù)是動態(tài)聯(lián)編的基礎(chǔ)虛函數(shù)是動態(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 () 即在類的說明中,在函數(shù)原型之前加即在類的說明中,在函數(shù)原型之前加virtual。注意:注意: virtual 只用在類定義的原型說明中,不能用在函數(shù)只用在類定義的原型說明中,不能用在函數(shù)實現(xiàn)中。實現(xiàn)中。 具有繼承性,基類中定義了虛函數(shù),派生類中無論是具有繼承性,基類中定義了虛函數(shù),派生類中無論是否說明,否說明,同原型同原型函數(shù)都自動為虛函數(shù)。函數(shù)都自動為虛函數(shù)。 本質(zhì):不是重載定義而是覆蓋定義。本質(zhì):不是重載定義而是覆蓋定義。 調(diào)用方式:通過調(diào)用方式:通過基類指針或引用基類指針或引用,執(zhí)行時會根據(jù),執(zhí)行時會根據(jù)指針指針指向的對象的類指向的對象的類,決定調(diào)用哪個函數(shù)。,決定調(diào)用哪個函數(shù)。 只能用只能用virtual聲明類的成員函數(shù),使它成為虛函數(shù),聲明類的成員函數(shù),使它成為虛函數(shù),而不能將類外的普通函數(shù)聲明為虛函數(shù)而不能將類外的普通函數(shù)聲明為虛函數(shù)純虛函數(shù)與抽象類純虛函數(shù)與抽象類H H H H H H 抽象類:不用來定義對象而只作為一種基本類型用作抽象類:不用來定義對象而只作為一種基本類型用作繼承的類。繼承的類。H H #include class B0 publ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論