c++的虛函式牽涉到了其c++的特性:多型性
一 . 在這裡回顧c++語言的三大特性:封裝、繼承和多型。
封裝可以隱藏實現細節,使得**模組化,繼承可以拓展已存在的模組。
目的都是為了**重用,而多型是為了介面重用。多型是通過虛函式實現的
a.封裝
把過程和資料封裝起來,決定哪些特性是可見的,哪些特性是隱藏的,保證了模組獨立性,資訊保密性、提高了程式重用性和可維護性。
b.繼承
指乙個物件從另外乙個物件獲得功能的過程,子類可以通過繼承得到與類相同的屬性,可以提高**的重用性,同時也讓類之間產生關係,作為多型特性的基礎。
c.多型
多型簡單說,就是某一類事物多種存在形態,在類與類之間存在關係的前提下,大大提高程式的擴充套件性。
二. 虛函式
虛函式必須是基類的非靜態成員函式,也就是在基類的成員函式前面加上關鍵字virtual,用法舉個例子
class father ;}
函式宣告前面加了virtual關鍵字,表示該函式是有多種形態的,該函式可以被多個物件所擁有,且功能不一。
三.關於虛函式,需要注意的幾個點:
1.靜態聯編與動態聯編
在c++中,聯編是指計算機各部分程式通過編譯、連線,形成乙個可執行程式的過程,聯編分為靜態聯編和動態聯編。
靜態聯編是指聯編工作是在程式編譯連線階段進行的,靜態聯編又稱早期聯編,因為這種聯編是在程式開始執行之前完成的。
特點:
呼叫速度快,效率高
動態聯編是指編譯程式在編譯階段並不能確切地知道將要呼叫的函式,只有在程式執行時才能確定將要呼叫的函式,為此要確切地知道將要呼叫的函式,要求聯編工作在程式執行時進行,這種在程式執行時進行的聯編工作被稱為動態聯編。c++規定:動態聯編是在虛函式的支援下實現的。
特點:
靈活,問題抽象性和問題的易維護性。
2.建構函式、析構函式與虛函式的關係
a.虛函式不可能是建構函式,任何建構函式之外的非靜態函式都可以是虛函式,虛函式的是由指標來呼叫的,必須先由編譯器例項化後才能使用虛函式。
b.析構函式可以是虛函式,但是在基類裡通常都要定義乙個虛析構函式,如果不這樣做,在new生成派生類的物件後,在delete的時候只會呼叫基類的析構函式,而不會呼叫派生類的析構函式。這樣,在派生類中申請的資源就不會得到釋放,就會造成記憶體洩漏,這是相當危險的:如果系統中有大量的派生類物件被這樣建立和銷毀,就會有記憶體不斷的洩漏,久而久之,系統就會因為缺少記憶體而崩潰。
c 虛函式,虛表相關總結
物件導向,從單一的類開始說起。class a 這個類中有兩個成員變數,都是int型別,所以這個類在記憶體中占用多大的記憶體空間呢?sizeof a 8個位元組,乙個int占用四個位元組。下圖驗證 這兩個資料在記憶體中是怎樣排列的呢?原來是這樣,我們根據debug出來的位址畫出a物件在記憶體的結構圖 ...
C 虛函式相關
c 的封裝 繼承和多型三大特性,封裝沒什麼好說的,就是把事務屬性和操作抽象成為類,在用類去例項化物件,從而物件可以使用操作 管理使用它的屬性。至於繼承,和多型密不可分。基類可以進行派生,而派生類則是繼承基類或稱父類,把基類中屬性和方法拿過來,變成自己的一部分,其中需要較為精細的思考。多型則是一種實現...
C 虛函式的總結
在基類中加入virtual關鍵字的函式就是虛函式,在基類的派生類中就可以通過重寫虛函式來實現對基類虛函式的覆蓋。當基類的指標指向派生類的物件時,對指標虛函式的呼叫實際上是呼叫了派生類的虛函式。這是物件導向中多型性的體現。例子 class a 這個例子是虛函式的乙個典型應用。虛函式的虛是在所謂的 動態...