1. 程式人生 > >關於C++中override與overload的總結和疑問

關於C++中override與overload的總結和疑問

 C++是一門magic的語言,很多機制複雜得讓人頭疼,但是這種迷宮競走的狀態讓人精力十足,我發誓了,不搞明白不罷休,同時也希望得到高手們的指點和幫助~



override   函式名和引數型別以及返回型別必須相同,即簽名都是一致的——或者叫相貌和衣服都是一樣的,一般用在繼承過程中。(高手判斷一下,除了實現細節,其他的是不是什麼都應該相同?所以叫做“重寫”——《C++程式設計思想》上是這麼翻譯的。)

overload   函式名必須相同,簽名必須不同(引數個數,順序,型別),返回型別可以不同,用在同一個類中,在編譯時候確定。

以下是轉載的內容:

override   是指在不同作用域中,多個函式原型完全一樣,而實現卻不同的函式。在C++中,經常發生在類的繼承中。當基類中的某個方法是virtual或pure virtual函式時 

  (當然訪問許可權必須是public或protected,因為從C++設計思想上來講private的函式不會是virtual的!!!這個請問一下,是不是這樣的??),

    其子類中對該方法的重新實現就屬於override(重寫)。

    使用時,可以通過基類的指標或者引用所指向的具體物件來確定呼叫的是哪個方法,從而實現函式的多型。

   (函式的多型?C++中實現多型性的手段之一嗎?還有多少其他的手段??)


    對於基類中的非virtual型別的成員函式,若其子類中也聲明瞭與該函式名稱相同的函式,那麼基類中的該函式(也許是一系列函式,如果該函式在基類中有過載的話)將被隱藏,可以通過域解析操作符來呼叫。不過按照C++的設計思想來說呢,基類中的非virtual型別的成員函式,是不需要在子類中進行修改的,所以如果在子類中出現了這種隱藏的情況,說明應該將基類中的該函式改成virtual型別的,然後就是override了!


    overload則是指在相同作用域中,多個函式具有相同的名字,但引數的數目和型別各不相同(當然相同數目和型別,如果順序不同也是可以的),因為函式過載的機制是在C++中函式的簽名與其引數有關,而不像C中,只與函式名有關。


     總之,override與overload的一個最大的區別就是作用域不同,以及函式原型是否相同.



override:     覆蓋是子類重寫父類的虛方法的一種形式。

overload:     過載是值允許存在重名的多個方法。而這些函式的引數列表不同(或者是引數
               的個數不同、或者是引數的型別不同或者兩者都不同)。


過載(overload 與多型的概念無關) :因為是在編譯階段就確定的。

只有在與執行階段確定的才稱為面向物件的多型性。即override

面向物件的幾個基本概念

多型:目的實現介面重用
繼承:實現程式碼重用。
封裝:實現程式碼的模組化.

override 表示重寫,用於繼承類對基類中虛成員的實現

overload 表示過載,用於同一個類中同名方法不同引數(包括型別不同或個數不同)的實現





好像好羅嗦啊!請高手指教~

最後,還想請您總結一下  介面與實現 的微妙關係~最好是打比方~

相關推薦

關於C++overrideoverload總結疑問

 C++是一門magic的語言,很多機制複雜得讓人頭疼,但是這種迷宮競走的狀態讓人精力十足,我發誓了,不搞明白不罷休,同時也希望得到高手們的指點和幫助~ override   函式名和引數型別以及返回型別必須相同,即簽名都是一致的——或者叫相貌和衣服都是一樣的,一般用在繼承

c++ override overLoad的區別

override(重寫,覆蓋)  1、方法名、引數、返回值相同。  2、子類方法不能縮小父類方法的訪問許可權。  3、子類方法不能丟擲比父類方法更多的異常(但子類方法可以不丟擲異常)。  4、存在於父類和子類之間。  5、方法被定義為final不能被重寫。  overload(過載,過載)  1、引數型別、

JDK1.71.8HashMapConcurrentHashMap總結比較

談到HashMap和ConcurrentHashMap,必然會聯想到一些其他集合結構,比如HashTable,Vector等,先理一下他們的區別吧。其實HashTable和Vector已經被廢棄了,HashTable和Vector以及ConcurrentHashMap都是執行緒安全的同步結構,區別是

C++const指標、引用的總結

C++中函式的引數相比C語言中的函式引數要複雜的多,其中主要的原因是C++中引入了引用以及const限定符。這兩個物件的引入,使得C++中的函式引數變得異常的複雜多變,每一種型別都具有比較適合的使用範圍。 一,引用 引用是物件的別名,必須在初始化的過程中與一個具體的物件繫

c++函式過載(overload覆蓋(override

過載(overload) 函式名相同,引數型別、數量、順序、返回型別中有一個以上不同: int add(int a, int b){return a + b;} double add(double a, double b) {return a + b;} //過載add函式 覆

C++數字字串之間的轉換(包括C++11新標準寬窄字元轉換)

1、字串數字之間的轉換 (1)string --> char *    string str("OK");    char * p = str.c_str(); (2)char * -->string    char *p = "OK";    string str(p); (3)char *

C++陣列STLvectorarray的比較

我的Github個人部落格 ----------------------------------- 阮一峰的網路日誌 ----------------------------------- 劉未鵬 | Mind Hacks ---------------------------

Java過載(overload重寫(override)的區別?

概念 方法的過載和重寫都是實現多型的方式,區別在於前者實現的是編譯時的多型性,而後者實現的是執行時的多型性。 過載發生在一個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同

c++的訪問屬性,繼承方式,一些問題的總結

第一:private, public, protected 訪問標號的訪問範圍。 private:只能由1.該類中的函式、2.其友元函式訪問。 不能被任何其他訪問,該類的物件也不能訪問。 prot

c++的簡單逗號表示式指標取地址運算子優先順序的示例

int *p1, *p2; int a = 10; int b = 20; p1 = &a; /////////////////////////////////////////////

C#override重寫new隱藏的區別,以及C#Java的Override區別

在C#中:override重寫,是指對父類中的虛方法(標記為override)或抽象方法(標記為abstract)進行重寫,實現新的功能,它必須與父類方法的簽名完全一致,而且與父類方法的可訪問性也必須一致new方法隱藏,是指在子類中重新定義一個簽名與父類的方法相同的方法,這個

C#StructClass的區別

而是 適用於 ack 定義 cts 多態 支持 關鍵字 for class和struct最本質的區別是class是引用類型,而struct是值類型,它們在內存中的分配情況有所區別。 什麽是class? class(類)是面向對象編程的基本概念,是一種自定義數據結構類型,通

C#outref區別

erro 變量 但是 color 賦值 運行 網上 ann amp 一、ref(參考)與out區別 1、out(只出不進) 將方法中的參數傳遞出去,在方法中將該參數傳遞出去之前需要在該方法起始賦初值;在方法外傳遞的該參數可以不用賦值; 簡單理解就是:將一個東西拋出去之前必須

C++關於[]靜態數組new分配的動態數組的區別分析

zid dad ima lin aer uem asa iba ash %E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3java%E8%99%9A%E6%8B%9F%E6%9C%BA7---%E7%BA%BF%E7%A8%8B%E5%AE%89%E5

C#靜態非靜態方法比較

通過 bsp 不同 oss 分配 htm 不能 size tar C#靜態方法與非靜態方法的區別不僅僅是概念上的,那麽他們有什麽具體的區別呢?讓我們通過本文向你做一下解析。 C#的類中可以包含兩種方法:C#靜態方法與非靜態方法。那麽他們的定義有什麽不同呢?他們在使用上

C#數組、ArrayListList三者的區別

collect comm 兩個 根據 -s lis 數據打包 功能 target 在C#中數組,ArrayList,List都能夠存儲一組對象,那麽這三者到底有什麽樣的區別呢。 數組 數組在C#中最早出現的。在內存中是連續存儲的,所以它的索引速度非常快,而且賦值

C#的值類型引用類型以及堆棧

堆棧 ima tro nbsp 在線 hid class類 sed pen 引用類型如:string,Object,class等總是在從托管堆上分配的,C#中new操作符返回對象的內存地址--也就是指向對象數據的內存地址。 以下是值類型與引用類型的表: 我們來看下

C++static關鍵字作用總結

可見性 apple 局部變量 內存 父類靜態 初始化 ati 退出 變量存儲 1.先來介紹它的第一條也是最重要的一條:隱藏。(static函數,static變量均可) 當同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。舉例來說明。同時編譯兩個源

C#怎樣實現序列化反序列化

image .com 合並 小白 str mat get new ons 我們想要將數據進行持久化的操作的話,也就是將數據寫入到文件中,我們在C#中可以通過IO流來操作,同時也可以通過序列化來操作,本人是比較推薦使用序列化操作的 因為我們如果想要將一個對象持久化到文件中

C#的 具名參數 可選參數

調用方法 4.0 frame framework 必須 遇到 錯誤 方法 public 具名參數 和 可選參數 是 C# framework 4.0 出來的新特性。 一. 常規方法定義及調用 public void Demo1(string x, int y) {