【學(xué)習(xí)筆記】C++語言程序設(shè)計(鄭莉):多態(tài)性-創(chuàng)新互聯(lián)

【學(xué)習(xí)筆記】C++語言程序設(shè)計(鄭莉):多態(tài)性
  • 1. 多態(tài)性
  • 2. 運(yùn)算符重載
    • 2.1 運(yùn)算符重載的規(guī)則
    • 2.2 運(yùn)算符重載為成員函數(shù)
    • 2.3 運(yùn)算符重載為非成員函數(shù)
  • 3. 虛函數(shù)
    • 3.1 一般虛函數(shù)成員
    • 3.2 虛析構(gòu)函數(shù)
    • 3.3 純虛函數(shù)與抽象類
    • 3.4 關(guān)鍵字override 與 final

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、成都做網(wǎng)站、萬山網(wǎng)絡(luò)推廣、小程序開發(fā)、萬山網(wǎng)絡(luò)營銷、萬山企業(yè)策劃、萬山品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供萬山建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn
1. 多態(tài)性

面向?qū)ο蟪绦蛟O(shè)計的真正優(yōu)勢不僅僅在于繼承,還在于將派生類對象當(dāng)基類對象一樣處理的功能。支持這種功能的機(jī)制就是多態(tài)和動態(tài)綁定。

  • 多態(tài)的類型
    • 多態(tài)是指同樣的消息被不同類型的對象接收時導(dǎo)致不同的行為。
    • 面向?qū)ο蟮亩鄳B(tài)性可以分為4類:重載多態(tài),強(qiáng)制多態(tài),包含多態(tài)和參數(shù)多態(tài)。前兩者稱為專用多態(tài),后兩者稱為通用多態(tài)。
    • 多態(tài)從實(shí)現(xiàn)的角度來講可以劃分為兩類:編譯時的多態(tài)和運(yùn)行時的多態(tài)。前者是在編譯的過程中確定了同名操作的具體操作對象,而后者則是在程序運(yùn)行過程中才動態(tài)的確定操作所針對的具體對象。這種確定操作的具體對象的過程就是綁定。
      • 綁定是指計算機(jī)程序自身彼此關(guān)聯(lián)的過程,就是把一條消息和一個對象的方法相結(jié)合的過程,可以分為靜態(tài)綁定和動態(tài)綁定。
      • 靜態(tài)綁定:綁定工作在編譯連接階段完成的情況,如重載、強(qiáng)制和參數(shù)多態(tài)。
      • 動態(tài)綁定:綁定工作在程序運(yùn)行階段完成的情況,如包含多態(tài)。

2. 運(yùn)算符重載

運(yùn)算符重載是對已有的運(yùn)算符賦予多重含義,使同一個運(yùn)算符作用于不同類型的數(shù)據(jù)時導(dǎo)致不同的行為。

2.1 運(yùn)算符重載的規(guī)則
  • C++中除了 “.” 、“.*” 、 “::” 和 “?:” 外,其它運(yùn)算符全部可以重載,而且只能重載C++中已經(jīng)有的運(yùn)算符。

  • 重載之后運(yùn)算符的優(yōu)先級和結(jié)合性都不會改變。

  • 可以重載為類的非靜態(tài)函數(shù)成員和重載為非成員函數(shù)。其語法格式為:

    返回類型 operator 運(yùn)算符(形參表){
      	函數(shù)體
      }

    返回類型指定了重載運(yùn)算符的返回類型;operator是定義運(yùn)算符重載函數(shù)的關(guān)鍵字;運(yùn)算符即使要重載的運(yùn)算符名稱。

2.2 運(yùn)算符重載為成員函數(shù)
  • 對于雙目運(yùn)算符,如果要重載為類的成員函數(shù),使之能夠?qū)崿F(xiàn)表達(dá)式 oprd1 B oprd2,其中oprd1為A類的對象,則應(yīng)當(dāng)把B重載為A類的成員函數(shù),該函數(shù)只有一個形參,形參的類型是oprd2所屬的類型。經(jīng)過重載之后,表達(dá)式oprd1 B oprd2就相當(dāng)于函數(shù)調(diào)用 oprd1.operator B(oprd2)。
  • 對于前置單目運(yùn)算符U,如”-“等,如果要重載為類的成員函數(shù),用來實(shí)現(xiàn)表達(dá)式U oprd,其中oprd為A類的對象,則U應(yīng)當(dāng)重載為A類的成員函數(shù),函數(shù)沒有形參。經(jīng)過重載之后,表達(dá)式U oprd相當(dāng)于調(diào)用oprd.operator U()。
  • 對于后置運(yùn)算符“++”和“–”,如果要重載為類的成員函數(shù),用來實(shí)現(xiàn)表達(dá)式oprd++或oprd–,其中oprd為A類的對象。重載之后,表達(dá)式oprd++和oprd–就相當(dāng)于函數(shù)調(diào)用oprd.operator++(0)和oprd.operator–(0)。

下面示例了復(fù)數(shù)類加減法運(yùn)算重載為成員函數(shù):

#includeusing namespace std;

//復(fù)數(shù)類加減法運(yùn)算重載為成員函數(shù)
class Complex {public:
	Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {}	//構(gòu)造函數(shù)
	Complex operator+ (const Complex &c2) const;					//重載復(fù)數(shù)加法
	Complex operator- (const Complex& c2) const;					//重載復(fù)數(shù)減法
	void display() const;											//顯示函數(shù)

private:
	double real, imag;
};

Complex Complex::operator+ (const Complex& c2) const {		//重載復(fù)數(shù)加法函數(shù)實(shí)現(xiàn)
	return Complex(real + c2.real, imag + c2.imag);
}

Complex Complex::operator- (const Complex & c2) const {		//重載復(fù)數(shù)減法函數(shù)實(shí)現(xiàn)
	return Complex(real - c2.real, imag - c2.imag);
}

void Complex::display() const{	//顯示函數(shù)實(shí)現(xiàn)
	cout<< "("<< real<< ","<< imag<< ")"<< endl;
}

int main() {Complex c1(5, 4), c2(2, 10), c3;								//定義復(fù)數(shù)類的對象
	cout<< "c1="; c1.display();
	cout<< "c2="; c2.display();
	c3 = c1 - c2;
	cout<< "c3=c1-c2="; c3.display();
	c3 = c1 + c2;
	cout<< "c3=c1+c2="; c3.display();
	return 0;
}

運(yùn)行結(jié)果為:
在這里插入圖片描述
下面示例了將單目運(yùn)算符“++”重載為成員函數(shù):

#includeusing namespace std;

//將單目運(yùn)算符“++”重載為成員函數(shù)
class Clock {public:
	Clock(int hour = 0, int minute = 0, int second = 0);		//Clock類構(gòu)造函數(shù)
	void showTime() const;										//時間顯示函數(shù)
	Clock& operator++();										//前置單目運(yùn)算符重載
	Clock operator++(int);										//后置單目運(yùn)算符重載
private:
	int hour, minute, second;
};

Clock::Clock(int hour, int minute, int second) {		//Clock類構(gòu)造函數(shù)實(shí)現(xiàn)
	if (0<= hour && hour<= 24 && 0<= minute && minute<= 60 && 0<= second && second<= 60) {this->hour = hour;
		this->minute = minute;
		this->second = second;
	}
	else {cout<< "Time error!"<< endl;
	}
}

void Clock::showTime() const {cout<< hour<< ":"<< minute<< ":"<< second<< endl;
}

Clock& Clock::operator++() {//前置單目運(yùn)算符重載函數(shù)
	second++;
	if (second >= 60) {second -= 60;
		minute++;
		if (minute >= 60) {	minute -= 60;
			hour = (hour + 1) % 24;
		}
	}
	return * this;
}

Clock Clock::operator++(int) {//后置單目運(yùn)算符重載函數(shù)
	Clock old = *this;
	++(*this);
	return old;
}

int main() {Clock myClock(23, 59, 59);
	cout<< "First time output: ";
	myClock.showTime();
	cout<< "Show myClock++: ";
	(myClock++).showTime();
	cout<< "Show ++myClock: ";
	(++myClock).showTime();
	return 0;
}

運(yùn)行結(jié)果為:
在這里插入圖片描述

2.3 運(yùn)算符重載為非成員函數(shù)
  • 對于雙目運(yùn)算符B,如果要實(shí)現(xiàn)oprd1 B oprd2,其中oprd1和oprd2中只要有一個具有自定義類型,就可以將B重載為非成員函數(shù),函數(shù)的形參為oprd1和oprd2。經(jīng)過重載之后,表達(dá)式oprd1 B oprd2就相當(dāng)于調(diào)用operator B(oprd1, oprd2)。
  • 對于前置單目運(yùn)算符U,如“-”等,如果要實(shí)現(xiàn)表達(dá)式U oprd,其中oprd具有自定義類型,就可以將U重載為非成員函數(shù),函數(shù)的形參為oprd。經(jīng)過重載之后,表達(dá)式U oprd相當(dāng)于調(diào)用operator U(oprd)。
  • 對于后置運(yùn)算符“++”和“–”,如果要實(shí)現(xiàn)表達(dá)式oprd++或oprd–,其中oprd為自定義類型,那么運(yùn)算符就可以重載為非成員函數(shù)。函數(shù)的形參為oprd和int類型參數(shù)。重載之后,表達(dá)式oprd++和oprd–就相當(dāng)于函數(shù)調(diào)用operator++(oprd, 0)和operator–(oprd, 0)。

運(yùn)算符重載為非成員函數(shù)的規(guī)則:

  • 函數(shù)的形參代表依自左至右次序排列的各操作數(shù)
  • 重載函數(shù)為非成員函數(shù)時
    • 參數(shù)個數(shù)=原操作數(shù)個數(shù)(后置++、–除外)
    • 至少應(yīng)該有一個自定義類型的參數(shù)。
  • 后置單目運(yùn)算符++和–的重載函數(shù),形參列表中要增加一個int,但不必寫形參名
  • 如果在運(yùn)算符的重載函數(shù)中需要操作某類對象的私有成員,可以將此函數(shù)聲明為該類的友元
  • 雙目運(yùn)算符B重載后,
    • 表達(dá)式oprd1 B oprd2 等同于 operator B(oprd1, oprd2)
    • 前置單目運(yùn)算符B重載后,表達(dá)式 B oprd 等同于 operator B(oprd)
    • 后置單目運(yùn)算符++和–重載后,表達(dá)式 oprd B 等同于 operator B(oprd, 0)

下面示例了以非成員函數(shù)形式重載Complex的加減法運(yùn)算和“<<”運(yùn)算符:

#includeusing namespace std;

//以非成員函數(shù)形式重載Complex的加減法運(yùn)算和“<<”運(yùn)算符
class Complex {public:
	Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {}
	friend Complex operator+ (const Complex& c1, const Complex& c2);
	friend Complex operator- (const Complex& c1, const Complex& c2);
	friend ostream & operator<< (ostream& out, const Complex& c);
private:
	double real, imag;
};

Complex operator+ (const Complex& c1, const Complex& c2) {//重載加法運(yùn)算符實(shí)現(xiàn)
	return Complex(c1.real + c2.real, c1.imag + c2.imag);
}

Complex operator- (const Complex& c1, const Complex& c2) {//重載減法運(yùn)算符實(shí)現(xiàn)
	return Complex(c1.real - c2.real, c1.imag - c2.imag);
}

ostream& operator<< (ostream& out, const Complex& c) {	//重載“<<”運(yùn)算符實(shí)現(xiàn)
	out<< "("<< c.real<< ", "<< c.imag<< ")";
	return out;
}

int main() {Complex c1(5, 4), c2(2, 10), c3;
	cout<< "c1="<< c1<< endl;
	cout<< "c2="<< c2<< endl;
	c3 = c1 - c2;
	cout<< "c3=c1-c2="<< c3<< endl;							//使用重載運(yùn)算符完成復(fù)數(shù)加法
	c3 = c1 + c2;
	cout<< "c3=c1+c3="<< c3<< endl;							//使用重載運(yùn)算符完成復(fù)數(shù)減法
	return 0;
}

運(yùn)行結(jié)果為:
在這里插入圖片描述


3. 虛函數(shù)
  • 用virtual關(guān)鍵字說明的函數(shù)。
  • 虛函數(shù)是實(shí)現(xiàn)運(yùn)行時多態(tài)性的基礎(chǔ)。
  • C++中的虛函數(shù)是動態(tài)綁定的函數(shù)。
  • 虛函數(shù)必須是非靜態(tài)的成員函數(shù),虛函數(shù)經(jīng)過派生后,就可以實(shí)現(xiàn)運(yùn)行過程中的多態(tài)。
3.1 一般虛函數(shù)成員

一般虛函數(shù)成員的聲明語法:

virtual 函數(shù)類型 函數(shù)名(形參表);

虛函數(shù)聲明只能出現(xiàn)在類定義中的函數(shù)原型中,而不能在成員函數(shù)實(shí)現(xiàn)的時候。

如果派生類沒有顯式的給出虛函數(shù)聲明,這是系統(tǒng)就會遵循以下規(guī)則來判斷派生類的一個函數(shù)成員是不是虛函數(shù):

  • 該函數(shù)是否與基類的虛函數(shù)有相同的名稱;
  • 該函數(shù)是否與基類的虛函數(shù)有相同的參數(shù)個數(shù)及相同的對應(yīng)參數(shù)類型;
  • 該函數(shù)是否與基類的虛函數(shù)有相同的返回值或者滿足賦值兼容規(guī)則的指針、引用型的返回值。

如果從名稱、參數(shù)及返回值3方面檢查之后,派生類的函數(shù)滿足上述條件,就會自動確定為虛函數(shù)。這時稱派生類的虛函數(shù)覆蓋了基類的虛函數(shù)。

3.2 虛析構(gòu)函數(shù)

虛析構(gòu)函數(shù)的聲明語法為:

virtual ~類名();

如果一個類的析構(gòu)函數(shù)是虛函數(shù),那么由她派生而來的所有子類的析構(gòu)函數(shù)也是虛函數(shù)。

3.3 純虛函數(shù)與抽象類

抽象類是一種特殊的類,是為了抽象和設(shè)計的目的而建立的。抽象類是帶有純虛函數(shù)的類。

  • 純虛函數(shù)

    • 純虛函數(shù)是一個在基類中聲明的虛函數(shù),它在該基類中沒有定義具體的操作內(nèi)容,要求各派生類根據(jù)實(shí)際需要給出各自的定義。即對于暫時無法實(shí)現(xiàn)的函數(shù),可以聲明為純虛函數(shù),留給派生類去實(shí)現(xiàn)。純虛函數(shù)的聲明格式為:

      virtual 函數(shù)類型 函數(shù)名(參數(shù)表)=0;

    聲明為純虛函數(shù)之后,基類中就可以不再給出函數(shù)的實(shí)現(xiàn)部分。純虛函數(shù)的函數(shù)體由派生類給出。

  • 抽象類

    • 帶有純虛函數(shù)的類是抽象類。抽象類的主要作用是通過它為一個類族建立一個公共的接口,使它們能夠更有效的發(fā)揮多態(tài)穩(wěn)定性。
    • 抽象類不能實(shí)例化。即不能定義一個抽象類的對象,但是可以定義一個抽象類的指針和引用。通過指針和引用,就可以指向并訪問派生類的對象,進(jìn)而訪問派生類的成員,這種訪問是具有多態(tài)性的。
3.4 關(guān)鍵字override 與 final

override與final都不是語言關(guān)鍵字,只有在特定的位置才有特別的含義,其它地方仍舊可以作為一般標(biāo)識符使用。

  • override
    • 顯式函數(shù)覆蓋
    • 聲明為該函數(shù)必須覆蓋基類的虛函數(shù),編譯器可發(fā)現(xiàn)“未覆蓋”錯誤
    • 覆蓋要求
      • 函數(shù)簽名(signature)完全一致
      • 函數(shù)簽名包括:函數(shù)名 參數(shù)列表 const
    • 顯式覆蓋的作用
      • 聲明顯式函數(shù)覆蓋,在編譯期間發(fā)現(xiàn)未覆蓋的錯誤;
      • 運(yùn)用顯式覆蓋,編譯器會檢查派生類中聲明override的函數(shù),在基類中是否存在可被覆蓋的虛函數(shù),若不存在,則會報錯。
  • final
    • 用來避免類被繼承,或是基類的函數(shù)被覆蓋。

課程鏈接:https://www.bilibili.com/video/BV1iF411Y74v

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁標(biāo)題:【學(xué)習(xí)筆記】C++語言程序設(shè)計(鄭莉):多態(tài)性-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://muchs.cn/article48/deieep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、響應(yīng)式網(wǎng)站、服務(wù)器托管網(wǎng)站設(shè)計、品牌網(wǎng)站建設(shè)、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)