先放出來兩個基類和派生類:
publicclass
baseclass
public
void method2(string
desc)
}public
class
derivedclass : baseclass
public
newvoid method2(string
desc)
}
new除了可以建立物件和作為泛型約束之外,還可以作為方法的修飾符,這裡討論的是作為方法的修飾符時與override的異同:
兩者該怎麼用呢?且看上面兩個父子類。derivedclass繼承了baseclass,method1重寫了基類的,method2隱藏了基類的。
單純地var bc = new baseclass();或var dc = new derivedclass();呼叫的是各自的方法,這點不用討論了。當baseclass bcdc = new derivedclass();時,這裡發生了一次向上轉型,bcdc從derivedclass轉型為其上級(基類)baseclass型別;例項bcdc.method1呼叫的將是derivedclass的方法,因為在例項化的時候method1已經被重寫(override)過了;而bcdc.method2呼叫的將是baseclass的方法,因為method2沒有被動到,依然是baseclass原來的方法。
總結起來就是:在派生類中,相同簽名的方法基類的也要重寫(影響到)的話就是用override,只想派生類實現給自己的話(不影響基類)就用new。這樣例項向上轉型後override的會被保留(因為已經被派生類重寫),new的會使用基類原來的方法。
c 關於new檔案
new檔案用來管理c 的動態記憶體,這個檔案宣告了幾個全域性空間的函式 不是std空間的函式,全域性空間的函式呼叫時是用全域性作用域解析符 包括operator new 和operator delete的過載 這些函式用於處理動態儲存空間請求。其new的標頭檔案源 ifndef new define...
c 中關於new語句
當我們使用關鍵字new在堆上動態建立乙個物件時,它實際上做了三件事 獲得一塊記憶體空間 呼叫建構函式 返回正確的指標。當然,如果我們建立的是簡單型別的變數,那麼第二步會被省略。舉個例子 a為某個類 a pa newa 3 那麼上述動態建立乙個物件的過程大致相當於以下三句話 只是大致上 a pa a ...
C 建立物件new與不new區別
記憶體的分配方式有三種 1.從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數。2.在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後在將這些區域性變數的記憶體空間 在棧上分配記憶體空間效率很...