一、虛函式學習
1.什麼是虛函式?
本質不是過載而是覆蓋。
2.虛函式有什麼作用?
實現多型。同乙個宣告的不同實現。
3.子類重寫父類的普通函式和子類重寫父類的虛函式有什麼區別?
可以讓成員函式的操作一般化,用基類的指標指向不同的派生類物件時,基類指標呼叫其虛函式成員函式,則會呼叫其真正指向物件的成員函式,而不是基類中定義的成員函式(只要派生類改寫了該成員函式)
若不是虛函式,則不管基類指標指向的哪個派生類的物件,呼叫時都會呼叫基類中定義的哪個函式。
個人理解:就像**初稿(基類),一稿、二稿、三稿(三個派生類),如果初稿沒有定義為虛函式那麼訪問一稿二稿三稿的時候只能看到初稿,但是如果定義為虛函式,只要派生類重寫了虛函式,就想看哪個稿子都可以。
4.應用場景
4.1 開發中會使用框架,開發人員無法對框架中的函式進行修改。對基類中的函式進重寫之後有的函式是用框架呼叫的。不使用虛函式則只能使用原框架中的函式,使用虛函式後則實現多型,能自己定義符合自己使用場景的函式。
4.2二、其他問題總結
1.純虛函式。
基類中只宣告虛函式但是不實現,要求在子類中必須實現。
定義方法:virtual functiontype functionname()=0;
和虛函式的區別是虛函式在基類中實現了的,子類進行覆蓋。
2.c++的多型性
編譯時多型性:通過過載函式實現
執行時多型性:通過虛函式實現
要實現多型需要:一是公有繼承、二是虛函式。
3.虛函式呼叫方式
通過基類的指標或引用。根據指標指向不同的物件決定呼叫哪個函式。
三、其他知識點總結
1.虛函式是動態繫結的基礎。是非靜態的成員函式。
2.virtual只能在宣告的時候使用,實現的時候不能加。
3.具有繼承性。基類中宣告的虛函式在派生類中無論是否說明,同原型函式都自動為虛函式。
4.虛繼承(不推薦,別用)
為了解決多重繼承而實現的。若d直接繼承b1、b2則a中的引數會在b**現兩次,浪費空間。使用虛繼承則會節省空間。
class a;
class b1: public virtual a;
class b2: public virtual a;
class d: public b1, public b2;
四、show me code
#includeusing namespace std;
class a
/*aptr->foo()輸出結果是:
b's foo()//這個明白,多型性
a's foo()//這個也明白,執行a::foo();
b's bar()// 雖然呼叫的是這個函式:a::foo(); 但隱式傳入的還是bobj 的位址,所以再次呼叫bar();呼叫時還是會呼叫b的函式, 與虛函式指標有關
aobj.foo()輸出結果是:
a's foo() // 這個不是指標,aobj完全是乙個a的物件,與多型沒有關係
a's bar()
*/
虛函式學習
include stdafx.h includeusing namespace std class base0 抽象類 不能例項化 不能定義物件但可以 定義它的引用和指標 可以指向派生類的物件 class base1 base1 base1 void virtualtest base0 ptr1 i...
虛擬繼承 虛函式學習總結 Z
虛擬繼承 虛函式學習總結 一 虛函式。其實是比較簡單的,它的存在就是為了給子類繼承,並且提供多個介面,所謂多個介面,就是多型性,它的主要特點就是父類的指標可以指向子類的物件,這樣的話,在繼承上會有好處。例如,某個父類有多個子類,在不知道會呼叫哪乙個子類物件的情況下,可以定義乙個父類的指標 f 這樣就...
C 學習軌跡之虛函式學習心得
一 虛函式含義 1.用virtual 關鍵字修飾 2.目的是實現多型性 3.通俗來講就是不同的物件接收相同訊息或者命令時會有不同的反應或動作,很自然,每個人看到相同的物體或場景,都會有不同的反應和感受,這就是人的多樣性。4.系統會根據不同物件或者不同引數列表呼叫不同的同名函式 5.動態多型 執行時 ...