物件導向程式設計的基本特徵:抽象、封裝、繼承、多型
c++中,多型分為編譯時的多型性和執行時的多型性。編譯時的多型是通過函式過載實現的,執行時的多型是通過虛函式實現的。
虛函式是過載的另一種形式。這是一種動態的過載方式,它提供了一種更為靈活的執行時的多型機制。虛函式允許函式呼叫於函式體之間的聯絡在程式執行時才建立,也就是在程式執行時才決定函式的具體內容,即所謂的動態聯編。
觀察以上程式的**,以及程式的執行結果。我們會發現,基類的指標,指向了派生類的物件,呼叫了乙個基類和派生類中的同名函式,最終呼叫的是基類中的函式。
在c++中規定:基類的物件指標可以指向它的公有派生類的物件,但是當其指向其公有派生類的物件時,其只能訪問派神類從基類中繼承來的成員,而不能訪問公有派生類中定義的成員。
我們使用物件指標的目的是為了表達一種動態的性質,即當指標指向不同的物件(基類的物件或派生類的 物件)時,呼叫不同類的成員函式。如果將函式說明為虛函式,就能事項這種動態呼叫。
虛函式就是在基類中被關鍵字virtual說明,並在派生類中重新定義的函式。虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類的指標或應用來訪問基類和派生類的同名函式。
在基類中將某個函式宣告為虛函式後,次函式就可以在其派生類中被重新定義。在派生類中重新定義時,需要注意,函式原型,包括函式返回值型別、函式名、引數個數、引數型別的順序都必須有基類中的原型完全相同。否則聲名的函式就不是虛函式,而是過載函式了。
如果在派生類中沒有對基類的虛函式重新定義,則公有派生類繼承其直接基類的虛函式。乙個虛函式無論被公有的繼承多少次,它仍保持其虛函式的特性。
虛函式必須是其所在類的成員函式。不能是友元函式,也不能是靜態成員函式,因為虛函式呼叫要依靠特定的物件來決定該啟用哪個函式。
雖然使用物件名和點運算子的方式也可以呼叫虛函式,但是這種方式是在編譯時進行的,是靜態編譯,它沒有利用到虛函式的特性。只有通過基類的指標訪問虛函式時,才能獲得執行時的多型性。
C C 複習之 虛析構函式
以上程式的執行結果 c 中當派生類的物件撤銷時,一般先執行基類的建構函式,然後執行派生類的析構函式。以上程式的執行結果是符合預期的,再看以下 以上 執行結果 執行結果可以看到,本程式只執行了基類的析構函式,而沒有執行派生類的析構函式。主函式中,用new運算子建立了乙個派生類的無名物件,並將乙個基類的...
虛函式複習
虛函式聯絡到多型,多型聯絡到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什麼都沒得談。下面是對c 的虛函式這玩意兒的理解。一,什麼是虛函式 如果不知道虛函式為何物,但有急切的想知道,那你就應該從這裡開始 簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來...
複習虛函式
面試的時候被問到虛函式,這兩天就研究下虛函式,真是基礎啊!下面先來點簡單的 簡單地說,那些被virtual關鍵字修飾的 成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現 多型性 polymorphism 多型性是將介面與實現進行分離 用形象的語言來解釋就是實現以共同的方法,但因個體差異,...