學過c++的都知道,要實現c++的多型性必須要用到虛函式,並且還要使用引用或者指標,以前學習的時候書本上也是這麼說,
但是書本上沒有說為什麼? 其實只要你認真思考過這個問題你會有三個疑問:
為什麼要用虛函式?
為什麼要用指標或者引用?
為什麼使用派生類和基類物件之間直接賦值不能實現??
乙個簡單的例子:
[cpp]view plain
copy
?class
a ;
class
b:public
a ;
intmain()
進一步的,了解c++的人都應該知道只要有虛函式的類就會有一張虛函式表,多型就是通過這張表來實現的。
所以,只要你不斷探索下去,就會很快發現前面兩個疑問豁然開朗,在這裡,我主要探索第三個疑問。
好了,我這裡假設你已經對前面兩個問題很清楚了。我們進一步把這個問題細化:
程式執行a = b操作時,b中的虛表到底有沒有賦給a?
若賦給a了,是不是一定要用指標或引用才能通過虛表呼叫虛函式?
下面我們通過乙個小程式,探索一下:
[cpp]view plain
copy
?class
a
virtual
void
print()
; class
b:public
a ;
intmain()
新增了**之後,我們繼續來執行上面的**,得到如圖的執行結果:
這說明,物件去訪問成員的虛函式並不通過虛函式表。
為了驗證虛函式表的確傳了過去,可以再新增下面兩行**:
[cpp]view plain
copy
?a *pa = &a;
pa->print();
輸出如下:
到這裡為止,提出的疑問基本上已經有了答案。但是,又產生了新的疑問,物件為什麼訪問不了虛函式表?
一句話解釋:
1.預設的賦值運算子並不會操作虛函式表。
2.要實現多型,必須使用指標或者引用。
C 學習之旅 為什麼要用虛函式
收集於 值得好好研究一,什麼是虛函式 如果不知道虛函式為何物,但有急切的想知道,那你就應該從這裡開始 簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多型性 polymorphism 多型性是將介面與實現進行分離 用形象的語言來解釋就是實現以共同...
為什麼要用虛析構函式
1 問題引出 為什麼要使用虛析構函式?class a 父親 int main 我們知道在delete p 中 delete 操作符,會呼叫物件的析構函式,但是這裡傳入的是父類物件指標,所以delete 此時並不知道應該呼叫哪個析構函式,保險起見則只呼叫父類的析構函式,也就是說如果沒有使用虛析構函式,...
拷貝建構函式為什麼要用引用?
一 引用 1.概念 引用不是新定義乙個變數,而是給已經存在的變數取了個別名,編譯器不會為引用開闢記憶體空間,它和它引用的變數共用同一塊記憶體空間。2.和指標區別 引用在定義時必須初始化,指標沒有要求 引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別實體 沒有...