過載 覆蓋和隱藏的區別

2021-08-03 05:35:02 字數 2617 閱讀 7873

多型性 

那麼多型的作用是什麼呢,封裝可以使得**模組化,繼承可以擴充套件已存在的**,他們的目的都是為了**重用。而多型的目的則是為了介面重用。也就是說,不論傳遞過來的究竟是那個類的物件,函式都能夠通過同乙個介面呼叫到適應各自物件的實現方法。

廣義的多型指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。c++支援兩種多型性:編譯時多型性,執行時多型性。 

a、編譯時多型性:通過過載函式實現 

函式的呼叫,在編譯器編譯期間就可以確定函式的呼叫位址,並生產**,是靜態的,就是說位址是早繫結的。

b、執行時多型性:通過虛函式實現。

函式呼叫的位址不能在編譯器期間確定,需要在執行時才確定,這就屬於晚繫結。

狹義的多型單單指執行時多型。多型性可以簡單地概括為「乙個介面,多種方法」,程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。

在繼承關係中,虛函式是根據指標指向的物件來確定呼叫哪個函式,而非虛函式是根據指標的型別來選擇呼叫哪個函式,跟指向的物件無關。

1、構成函式覆蓋的條件為:

a)基類函式必須是虛函式(使用virtual關鍵字進行宣告)。

b) 發生覆蓋的兩個函式要分別位於派生類和基類中。

c) 函式名稱與引數列表必須完全相同。

由於c++的多型性是通過虛函式來實現的,所以函式的覆蓋總是和多型關聯在一起。在函式覆蓋的情況下,編譯器會在執行時根據物件的實際型別來確定要呼叫的函式。

2、覆蓋和隱藏的區別

a) 派生類的函式與基類的函式完全相同(函式名和引數列表都相同),只是基類的函式沒有使用virtual關鍵字。此時基類的函式將被隱藏,而不是覆蓋(請參照上文講述的函式覆蓋進行比較)。

b) 派生類的函式與基類的函式同名,但引數列表不同,在這種情況下,不管基類的函式宣告是否有virtual關鍵字,基類的函式都將被隱藏。注意這種情況與函式過載的區別,過載發生在同乙個類中。

3、過載不關心函式返回型別,只關心引數列表,對於同名函式,只要引數列表相同,儘管返回型別不一樣,依舊認為是重複定義,會報錯。(前提是在同乙個類裡面)

以下參考部落格:

1.過載:過載從overload翻譯過來,是指同一可訪問區內被宣告的幾個具有不同引數列(引數的型別,個數,順序不同)的同名函式,根據引數列表確定呼叫哪個函式,過載不關心函式返回型別。

示例**如下:

class a;
前四個互為過載函式,最後乙個和第乙個不是過載函式。

2.隱藏:隱藏是指派生類的函式遮蔽了與其同名的基類函式。注意只要同名函式,不管引數列表是否相同,基類函式都會被隱藏。

例項**如下:

#includeusing namespace std;

class a

};class b : public a

};int main()

3.覆蓋:覆蓋翻譯自override,是指派生類中存在重新定義的函式。其函式名,引數列表,返回值型別,所有都必須同基類中被重寫的函式一致。基類該函式必須被virtual關鍵字修飾,只有函式體不同(花括號內),派生類呼叫時會呼叫派生類的覆蓋函式,不會呼叫被覆蓋函式。

例項**如下:

#includeusing namespace std;

class a

};class b : public a

};int main()

過載和覆蓋的區別:

(1)範圍區別:覆蓋和被覆蓋的函式在不同的類中,過載和被過載的函式在同一類中。

(2)引數區別:覆蓋與被覆蓋的函式引數列表一定相同,過載和被過載的函式引數列表一定不同。

(3)virtual的區別:覆蓋的基類必須要有virtual修飾,過載函式和被過載函式可以被virtual修飾,也可以沒有。

隱藏和覆蓋,過載的區別:

(1)與過載範圍不同:隱藏函式和被隱藏函式在不同類中。

(2)引數的區別:隱藏函式和被隱藏函式引數列表可以相同,也可以不同,但函式名一定相同;當引數不同時,無論基類中的函式是否被virtual修飾,基類函式都是被隱藏,而不是被覆蓋。

過載 覆蓋和隱藏區別

a.成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。b.覆蓋是指派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式必須有virtual 關鍵字。c.隱藏 是指派生類...

過載 覆蓋 隱藏的區別

在csdn上經常看到這種問題 如何區別3者,從論壇中已經能夠找到完善的答案,現在自己也總結一下,加深印象,同時希望對讀者您有用。這不是乙個新的概念,在c 中乙個比較重要的概念 c語言裡面不允許 特徵就是允許函式名相同,通過指定不同的引數或者返回值來區別。這裡我們所說的過載是針對c 中類的,類中過載與...

過載 覆蓋 隱藏的區別

過載 覆蓋 隱藏的區別 成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式必須有virtual 關鍵字。隱藏...