參考:
1、c++ primer plus 第六版
2、中國大學慕課:程式設計與演算法(三)
在類的定義中,前面有virtual關鍵字的成員函式就是虛函式
說明:class
a//類外函式定義
void a ::
function()
1、virtual關鍵字只需要在類定義裡的函式宣告時加上,函式定義時不用加
2、建構函式和靜態成員函式不能是虛函式
3、析構函式應當是虛函式
4、友元函式不能是虛函式
5、基類中的成員函式定義為虛函式,派生類中不加virtual關鍵字的同名同參函式也是虛函式
1、同乙個方法在基類或者不同的派生類中的行為是不同的。
即具有多種形態,基類指標呼叫同名虛函式有不同的結果。
2、虛函式參與多型,普通成員函式不行
多型的表現形式有兩種:
1、派生類的指標可以賦給基類的指標(反過來不行)
可以看到成員函式b()是虛函式,執行相同的語句卻因為指向的物件不同而產生不同的結果,這就是多型。
2、派生類的物件可以賦給基類的引用(反過來不行)
(同理將上面的**basep改為引用)
這種呼叫同乙個函式卻有不同結果的機制就叫多型
說明:1、在非建構函式非析構函式的成員函式中呼叫虛函式就是多型,會根據不同物件產生不同結果
2、在建構函式和析構函式中呼叫虛函式不是多型,會呼叫自己類的成員函式
1、增強程式的可擴充性:程式修改或增加功能的時候,需要改動和增加的**較少
2、用基類指標陣列存放各種派生類物件的指標,讓後遍歷該陣列,就能對個個派生類的物件做各種操作
(不必糾結print()函式,關鍵理解虛函式表是儲存在資料元素的前面)class
base
class
derived
:public base
執行下面的語句:
sizeof
(base)
//值為 8,
sizeof
(derived)
//值為12,
可以看到多出來了4位元組
多型的函式呼叫被變編譯一系列根據基類指標(或引用)指向的物件中存放的虛函式表的位址,在虛函式表中查詢虛函式的位址並呼叫虛函式的指令
通過基類的指標刪除派生類物件時應先呼叫派生類的析構函式在呼叫基類的析構函式,但是通常情況下(虛構函式不是虛函式)只呼叫基類的建構函式。
把基類的析構函式宣告為virtual: 這樣就可以在基類的指標刪除派生類物件時先呼叫派生類的析構函式再呼叫基類的析構函式。
// 繼承.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
1、一般來說應把基類的析構函式宣告為虛函式。
2、類定義了虛函式也應將析構函式定義為虛函式。
3、派生類的析構函式可以不加virtual關鍵字。
純虛函式:沒有函式體的虛函式
宣告格式:
class
a
包含純虛函式的類為抽象類。
class
aint
main()
1、抽象類的成員函式內可以呼叫純虛函式,但是在建構函式或析構函式內部不能呼叫純虛函式
2、如果乙個類是抽象類的派生類,那麼它必須實現所有的純虛函式才不是抽象類
C 多型 虛函式 指標 虛函式表
本文總結了和幾位老師的部落格 一 什麼是多型 關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術...
虛函式和虛函式表
虛函式和虛函式表 1 虛函式 c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。如果呼叫非虛函式,則無論實際物件是什麼型別,都執行基類型別所定義的函式。非...
虛函式和虛函式表
多型是由虛函式實現的,而虛函式主要是通過虛函式表 v table 來實現的。這個類的每乙個物件都會包含乙個虛指標 虛指標存在於物件例項位址的最前面,保證虛函式表有最高的效能 這個虛指標指向虛函式表。注 物件不包含虛函式表,只有虛指標,類才包含虛函式表,派生類會生成乙個相容基類的虛函式表。下圖是原始基...