在講解虛函式之前需要先區分一下以下定義:過載,重寫,重定義
過載---同乙個類中函式名相同,函式的引數列表不相同的兩個及兩個以上的函式就是函式過載。注意:函式的返回值不能作為函式是否過載的依據。
重寫---是在子類繼承父類的時候,對父類的虛函式進行了覆蓋。重寫會使程式發生動態聯編,產生多型。
重定義---是在子類繼承父類的時候,對父類的非虛函式進行了覆蓋。
物件導向設計語言具有----多型性。
使用指標或引用訪問非虛函式時,編譯器根據指標本身的型別決定要呼叫哪個函式。而不是不是根據指標指向物件的型別。
使用指標訪問虛函式時,編譯器根據指標指向的型別決定要呼叫哪個函式,與指標本身型別無關。
派生類可以對基類的虛函式的進行重寫(重定義、覆蓋):
與基類的虛函式的引數型別必須一樣
與基類的虛函式的引數個數必須一樣
與基類的虛函式的函式返回值型別必須一樣(可以替換為子類型別指標)
c++函式數呼叫預設不使用動態繫結,觸發動態繫結必須滿足一下條件:
哪些函式不能為虛函式
建構函式:若為建構函式則不能正確呼叫 父類的建構函式
靜態成員函式:靜態成員函式對每個類來說只有乙份**,所有物件共享這份**,它不歸屬於某個具體物件所有。
友元函式:根本就不是成員函式,談何虛函式
內斂函式:
賦值操作符過載函式:基類與子類的引數型別不同
c++預設的析構函式不是虛函式是因為虛函式需要額外的虛函式表和虛表指標,占用額外的記憶體。而對於不會被繼承的類來說,其析構函式如果是虛函式,就會浪費記憶體。因此c++預設的析構函式不是虛函式,而是只有當需要當作父類時,設定為虛函式。
c++物件模型中資料成員,成員函式的位置:
virtual函式則有以下機制存放:
每個類產生一堆指向虛函式的指標,放在**中,這個**被稱為虛函式表(bptr)
每個物件都被新增乙個指向虛函式表的指標(虛函式表指標vptr)。
不同繼承模式下物件中虛函式表存在形態:詳細類容參考部落格
單繼承:派生類中僅有乙個虛函式表。這個虛函式表和基類的虛函式表不是乙個表(無論派生類有沒有重寫基類的虛函式),但是如果派生類沒有重寫基類的虛函式的話,基類和派生類的虛函式表指向的函式位址都是相同的。
多繼承:派生類中有多個虛函式表,虛函式的排列方式和繼承的順序一致。派生類重寫函式將會覆蓋所有虛函式表的同名內容,派生類自定義新的虛函式將會在第乙個類的虛函式表的後面進行擴充。
C 虛函式及虛函式表詳解
多型 的關鍵在於通過基類指標或引用呼叫乙個虛函式時,編譯時不確定到底呼叫的是基類還是派生類的函式,執行時才確定。include using namespace std class a virtual void func2 class b public a int main 在 32 位編譯模式下,程...
C 虛函式表詳解
c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,...
虛函式和虛函式表
虛函式和虛函式表 1 虛函式 c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。如果呼叫非虛函式,則無論實際物件是什麼型別,都執行基類型別所定義的函式。非...