C 中為什麼要用虛函式 指標或引用才能實現多型?

2022-03-27 11:21:52 字數 1317 閱讀 7120

學過c++的都知道,要實現c++的多型性必須要用到虛函式,並且還要使用引用或者指標,以前學習的時候書本上也是這麼說,

但是書本上沒有說為什麼?   其實只要你認真思考過這個問題你會有三個疑問:

為什麼要用虛函式?

為什麼要用指標或者引用?

為什麼使用派生類和基類物件之間直接賦值不能實現??

乙個簡單的例子:

[cpp]view plain

copy

print

?class

a  ;  

class

b:public

a  ;  

intmain()  

進一步的,了解c++的人都應該知道只要有虛函式的類就會有一張虛函式表,多型就是通過這張表來實現的。

所以,只要你不斷探索下去,就會很快發現前面兩個疑問豁然開朗,在這裡,我主要探索第三個疑問。

好了,我這裡假設你已經對前面兩個問題很清楚了。我們進一步把這個問題細化:

程式執行a = b操作時,b中的虛表到底有沒有賦給a?

若賦給a了,是不是一定要用指標或引用才能通過虛表呼叫虛函式?

下面我們通過乙個小程式,探索一下:

[cpp]view plain

copy

print

?class

a    

virtual

void

print()  

;  class

b:public

a  ;  

intmain()  

新增了**之後,我們繼續來執行上面的**,得到如圖的執行結果:

這說明,物件去訪問成員的虛函式並不通過虛函式表。

為了驗證虛函式表的確傳了過去,可以再新增下面兩行**:

[cpp]view plain

copy

print

?a *pa = &a;  

pa->print();  

輸出如下:

到這裡為止,提出的疑問基本上已經有了答案。但是,又產生了新的疑問,物件為什麼訪問不了虛函式表?

一句話解釋:

1.預設的賦值運算子並不會操作虛函式表。

2.要實現多型,必須使用指標或者引用。

C 學習之旅 為什麼要用虛函式

收集於 值得好好研究一,什麼是虛函式 如果不知道虛函式為何物,但有急切的想知道,那你就應該從這裡開始 簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多型性 polymorphism 多型性是將介面與實現進行分離 用形象的語言來解釋就是實現以共同...

為什麼要用虛析構函式

1 問題引出 為什麼要使用虛析構函式?class a 父親 int main 我們知道在delete p 中 delete 操作符,會呼叫物件的析構函式,但是這裡傳入的是父類物件指標,所以delete 此時並不知道應該呼叫哪個析構函式,保險起見則只呼叫父類的析構函式,也就是說如果沒有使用虛析構函式,...

拷貝建構函式為什麼要用引用?

一 引用 1.概念 引用不是新定義乙個變數,而是給已經存在的變數取了個別名,編譯器不會為引用開闢記憶體空間,它和它引用的變數共用同一塊記憶體空間。2.和指標區別 引用在定義時必須初始化,指標沒有要求 引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別實體 沒有...