C 覆蓋方法與過載方法

2021-10-09 11:41:37 字數 3599 閱讀 5001

什麼是類函式的覆蓋方法:

覆蓋方法用於同一函式的重寫派生類函式覆蓋基類同名函式

覆蓋方法重寫(覆蓋)了乙個方法,以實現不同的功能.一般是用於子類在繼承父類時,重寫(重新實現)父類中的方法

覆蓋方法的特徵:

範圍不同(分別位於 基類 和 派生類中)

函式名字相同

函式引數相同

基類函式必須有virtual(虛函式)關鍵字

為什麼需要覆蓋方法:

在 c++ 裡,當我們需要在基類裡提供乙個通用的函式,但是在它的某個子類裡,需要修改這個方法(通用函式)的實現,就要用到覆蓋方法

當父類中的某些方法不能滿足要求時,子類中改寫父類的方法

注意:

1.重寫方法的引數列表(方法名稱,引數列表,返回型別)必須完全與被重寫的方法相同否則不能稱其為覆蓋而是 過載

2.重寫方法的訪問修飾符一定要大於被重寫方法的訪問修飾符(public>protected>default>private)

3.重寫的方法的返回值必須和被重寫的方法的返回一致

3.被重寫的方法不能為private,否則在其子類中只是新定義了乙個方法,並沒有對其進行重寫

5.靜態方法不能被重寫為非靜態的方法(會編譯出錯)

覆蓋方法例程

#include

#include

using

namespace std;

//todo覆蓋方法

class

animal

;class

monkey

:public animal//todo建立乙個繼承自animal基類的子類monkey

;class

turtle

:public animal

;//todo基類animal的構造器定義與成員函式定義

animal::

animal

(string name)

void animal::

eat(

)//todo基類中的通用方法eat的定義

void animal::

sleep()

void animal::

run(

)//todo子類monkey的構造器定義與成員函式定義

monkey::

monkey

(string name)

:animal

(name)

void monkey::

climb()

void monkey::

eat(

)//todo繼承基類animal後的子類monkey的 通用函式eat通用方法的覆蓋

//todo子類turtle的構造器定義與成員函式定義

turtle::

turtle

(string name)

:animal

(name)

void turtle::

swim()

void turtle::

eat(

)int

main()

結果

什麼是類函式的過載方法:

對於類的方法(包括從父類中繼承的方法),方法名相同,引數列表不同的方法之間就構成了過載關係 ,這裡有兩個問題需要注意

1.引數列表又叫引數簽名,指三樣東西:引數的型別,引數的個數,引數的順序 ,這三者只要有乙個不同就叫做引數列表不同

2.過載關係只能發生在同乙個類中嗎?非也,這時候你要深刻理解繼承,要知道乙個子類所擁有的成員除了自己顯式寫出來的以外,還有父類遺傳下來的,所以子類中的某個方法和父類中繼承下來的方法也可以發生過載的關係

為什麼需要過載方法:

類過載機制使你可以定義多個同名的方法(函式),只是他們的輸入引數必須不同(編譯器是依靠不同的輸入引數來區分不同的方法)

注意:?

對從基類繼承來的方法進行過載,程式將永遠編譯不過(子類中不可過載繼承自基類的方法)因為如果在子類中進行基類中某方法的重新定義,就變成了覆蓋方法 (進行覆蓋前提是覆蓋函式和被覆蓋函式的函式名和引數列表一致)

過載方法例程

class

animal

;class

monkey

:public animal

;class

turtle

:public animal

;//todo基類animal的構造器定義與成員函式定義

animal::

animal

(string name)

void animal::

eat(

)void animal::

eat(string food)

//todo基類中的函式eat進行過載

void animal::

eat(

int count)

//todo基類中的函式eat再次進行過載

void animal::

sleep()

void animal::

run(

)//todo子類monkey的構造器定義與成員函式定義

monkey::

monkey

(string name)

:animal

(name)

void monkey::

eat(

float a)

void monkey::

climb()

//todo子類turtle的構造器定義與成員函式定義

turtle::

turtle

(string name)

:animal

(name)

void turtle::

swim()

intmain()

//

結果總結:?類函式的覆蓋和過載具有以下相同點:

1.都要求類函式同名

2.都可以用於抽象類函式和非抽象類函式之間

類函式的覆蓋和過載在使用時有以下區別:

1.覆蓋 要求類函式的引數列表(引數簽名)必須一致 過載 要求引數必須不一致

2.覆蓋要求返回型別必須一致 過載 沒有要求

3.覆蓋 只能用於子類覆蓋基類的類函式 過載 同乙個類的所有方法都會被過載 (包括從父類中繼承而來的方法)但不可在子類中過載父類中的方法

4.覆蓋 對方法的訪問許可權和丟擲的異常有特殊要求 過載 沒有限制

5.覆蓋 父類中的乙個方法只能被子類覆蓋一次 過載 乙個方法可以在所有類中被過載多次

方法覆蓋與方法過載

方法覆蓋 a 即方法重寫。是指在乙個類的子類中定義與父類方法同名的方法,並且他們的引數列表 返回值型別完全 相同,但方法體不同的現象。b 子類中的方法不能丟擲父類中被覆蓋方法沒有丟擲的異常。c 子類中的方法的訪問許可權不能低於父類中被覆蓋方法的訪問許可權。d 方法覆蓋限於子類對父類方法進行,不能在同...

C 覆蓋方法和過載方法

覆蓋方法 overriding 在 c 裡,當我們需要在基類裡提供乙個通用的函式,但是在它的某個子類裡,需要修改這個方法的實現,就要用到覆蓋。覆蓋是存在類中,子類覆蓋是從基類繼承過來的方法 函式 但是函式名 返回值 引數列表都必須和基類的方法相同。c 可以讓我們很容易實現這種既有共同特徵又需要在不同...

細說C 覆蓋方法和過載方法

很多初學者朋友可能都傻傻分不清覆蓋方法和過載方法的區別是什麼,那麼小雨今天就以例項來給朋友們講解一下。首先說覆蓋方法,讓我們看下面的例子 class animal class pig animal class bird animal void animal move void pig move vo...