覆蓋方法和過載方法

2022-03-22 06:06:08 字數 3080 閱讀 8774

覆蓋方法:

通過之前的學習,我們已經知道了如何通過建立新的子類來重用現有的**(繼承)。

雖然這個方案可以讓我們輕鬆解決許多現實世界裡的問題,但在某些場合,卻又顯得不夠用。

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

回到我們之前的例子,我們都知道,但凡是個動物都知道吃!那麼吃我們就可以說是動物的乙個共同特徵,但我們知道不同動物會有不同的吃法。。。。。。

c++ 可以讓我們很容易實現這種既有共同特徵又需要在不同的類裡有不同實現的方法。

我們需要做的是在類裡重新宣告這個方法,然後再改寫一下它的實現**(就像它是乙個增加的方法那樣)就行啦。

修改例題:為我們的 animal 新增 eat()方法,並在pig 和 turtle 中覆蓋。

#include #include 

class

animal

;class pig : public

animal

;class turtle : public

animal

;animal::animal(std::

string

thename)

void

animal::eat()

void

animal::sleep()

void

animal::drool()

pig::pig(std::

string

thename) : animal(thename)

void

pig::climb()

void

pig::eat()

turtle::turtle(std::

string

thename) : animal(thename)

void

turtle::swim()

void

turtle::eat()

intmain()

i'

m eatting!

小豬豬正在吃魚!i

'm eatting!

小甲魚正在吃東坡肉!我是乙個只漂亮的小母豬豬,我會上樹,我正在爬樹,噓。。。

我是乙隻小甲魚,當母豬想抓我的時候,我就游到海浬。。哈哈。。

請按任意鍵繼續. . .

view code

過載方法

簡化程式設計工作和提高**可讀性的另一種方法是對方法進行過載。

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

過載並不是乙個真正的物件導向特性,它只是可以簡化程式設計工作的捷徑,而簡化程式設計工作正是 c++ 的全部追求! 我們來測試下對 eat()方法進行過載:test

#include #include 

class

animal

;class pig : public

animal

;class turtle : public

animal

;animal::animal(std::

string

thename)

void

animal::eat()

void animal::eat(int

eatcount)

void

animal::sleep()

void

animal::drool()

pig::pig(std::

string

thename) : animal(thename)

void

pig::climb()

turtle::turtle(std::

string

thename) : animal(thename)

void

turtle::swim()

intmain()

i'

m eatting!

i'm eatting!

我吃了15碗餛飩!我是乙個只漂亮的小母豬豬,我會上樹,我正在爬樹,噓。。。

我是乙隻小甲魚,當母豬想抓我的時候,我就游到海浬。。哈哈。。

請按任意鍵繼續. . .

view code

新手應該注意

對方法(函式)進行過載一定要有的放矢,過載的方法(函式)越多,程式就越不容易看懂。

在對方法進行覆蓋(注意區分覆蓋和過載)時一定要看仔細,因為只要宣告的輸入引數和返回值與原來的不一致,你編寫出來的就將是乙個過載方法而不是覆蓋方法。這種錯誤以個人經驗告訴你:往往很難除錯!

對從基類繼承來的方法進行過載,程式永遠不會像你預期的那樣工作!(try)

#include #include 

class

animal

;class pig : public

animal

;class turtle : public

animal

;animal::animal(std::

string

thename)

void

animal::eat()

void

animal::sleep()

void

animal::drool()

pig::pig(std::

string

thename) : animal(thename)

void

pig::climb()

void pig::eat(int eatcount)//

不能再繼承之後,過載父類的方法

turtle::turtle(std::

string

thename) : animal(thename)

void

turtle::swim()

intmain()

方法覆蓋和方法過載

0 最根本的區別是,方法的過載是不同的方法叫了同樣的名字,而方法的覆蓋是同乙個方法在子類和父類之間的多型表現。1 方法的覆蓋是子類和父類之間的關係,是垂直關係 方法的過載是同乙個類中方法之間的關係,是水平關係。2 覆蓋只能由乙個方法,或只能由一對方法產生關係 方法的過載是多個方法之間的關係。3 覆蓋...

C 覆蓋方法和過載方法

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

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

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