多型分為靜態多型、動態多型。靜態多型,過載,就是在同一作用域內,函式名相同,引數不同,根據引數來確定呼叫。動態多型,重寫,主要是虛函式,父類指標指向子類物件,接著再用指標呼叫被重寫函式。乙個類有虛函式,就有虛函式表,虛函式表裡存放的就是每個虛函式的位址,若子類未重寫虛函式,那麼虛函式表中的虛函式的位址就還是父類的虛函式的位址,一旦子類重寫了,那麼這個位址就會變成重寫之後的虛函式的位址。
說到虛函式,如果 乙個類要子類,那麼它的析構函式一定要宣告為虛函式,不然會造成記憶體洩漏,原因在於,如果父類的析構函式不是虛函式,那麼在銷毀物件時,只會呼叫父類析構函式,子類物件無法釋放,導致記憶體洩露;如果父類析構函式是虛函式。那麼在釋放時,首先呼叫子類析構,使得子類物件得以釋放,接著進入父類析構,釋放父類物件,這樣父類子類都得以完全釋放。這就是為什麼父類析構必須是虛函式的原因。
再講到記憶體洩漏,記憶體洩漏是c++開發中比較容易出現的現象,往輕的說,乙個專案執行速度及效率會降低,慢慢變卡,體驗會急劇下降,嚴重的話可能會導致機器崩潰和宕機,所以在開發過程中記憶體洩漏需要尤為重視。動態分配記憶體比較常用,比較容易出現未釋放或者釋放不完全的情況,也很難發現哪塊造成記憶體洩漏了,可以通過一些記憶體洩漏檢測工具來定位防止,這個後面講。這裡著重說一下c++令乙個有效防止記憶體洩漏的方法—智慧型指標!
智慧型指標有自動指標、共享指標、唯一指標、弱指標。
若使用智慧型指標,則不需程式設計師自己釋放,智慧型指標機制就是自動釋放已申請的記憶體。auto_ptr在c++11當中雖然已標為棄用,但還可以用,在c++17中就完全移除了。原因在於auto_ptr在釋放的時候使用delete而不使用delete,這樣就會造成記憶體洩漏,故不再使用。還有唯一指標、弱指標、共享指標。這裡說一下比較重要的共享指標,只說核心:多個指標指向同一塊記憶體,在這塊記憶體上每多乙個指標指向它,那麼它的引用計數就會+1,在釋放的時候,每釋放乙個指標,那麼它的引用計數就會-1,直到它的引用計數減到0,才會得到完全釋放。
通過檢測工具來排查記憶體洩漏事件是乙個非常有效的手段。上面提到了vld記憶體洩漏檢測工具,該工具執行起來後可直接在專案中看到那一塊造成記憶體洩漏了,甚至可以具體看到哪一行有問題,定位出來之後可以針對性避免,可以大大提高產品的健碩性。
提到記憶體洩漏就難以不提到記憶體溢位,記憶體洩漏基本就是未釋放或者釋放不完全導致,那麼記憶體溢位呢,舉個很簡單的例子:比如現在需要開闢10個位元組的記憶體,但是系統只剩5個位元組的大小了,這個時候就會造成記憶體溢位;再有就是陣列溢位也是記憶體溢位的典型示例。這樣就可以很清楚的搞明白洩漏和溢位是怎麼回事了。
三大特性之一「多型」
方法過載 發生在同乙個類中,出現的方法名相同,引數列表不同的情況!與返回值型別 構造方法沒有返回值型別 和訪問修飾符無關!方法重寫 發生在子類和父類之間,當子類繼承了父類的方法資訊之後,如果覺得不夠強大,可以進行優化 重寫!方法名相同。引數列表也相同,返回值型別相同或者為其子類,訪問修飾符不能嚴於父...
物件導向三大特性之一 多型(C )
目錄 多型的定義及實現 抽象類多型的原理 單繼承和多繼承關係的虛函式表 1 什麼是多型?當不同的物件去完成某個行為時,會產生出不同的結果。多型是 不同繼承關係的類物件去呼叫同一函式時,產生了不同的行為。例如 student類繼承了person類。person物件買票全價,student物件買票半價。...
物件導向三大特徵之一多型
在介紹完前面那兩個物件導向的兩個特性之後,接下來就是最後乙個特性 多型 定義 多型表示不同的物件可以執行相同的動作,但要通過它們自己的實現 來執行。例子 在國粹 京劇 中,很多都是師傅帶徒弟,是代代相傳的藝術。假設師傅是乙個非常著名的京劇藝術家,徒弟也很厲害,模仿師傅的戲十分的惟妙惟肖。有一天,師傅...