首页
/
每日頭條
/
職場
/
c語言多态的概念
c語言多态的概念
更新时间:2025-07-19 08:17:14

c語言多态的概念(C類和對象)1

c語言多态的概念(C類和對象)2

然後我們再去看c 中,多态實現的原理.

前面我們說,多态有,靜态多态和動态多态,然後并且使用了一下多态,做了個案例.

c語言多态的概念(C類和對象)3

c語言多态的概念(C類和對象)4

并且我們說,多态的實現需要滿足條件,就是首先要有繼承關系,要有父類,子類,

然後子類還要必須去重寫父類中的虛函數,不重寫虛函數的話,那叫做,函數地址早綁定.對吧.

然後要使用多态的話,需要讓父類的指針或者引用,指向子類的對象對吧.

并且我們提出了,重寫的概念.

c語言多态的概念(C類和對象)5

c語言多态的概念(C類和對象)6

然後我們通過例子去看,多态的實現原理.

首先去看,上節課我們用到的這個Animal類,然後

裡面有個spreak這個,虛函數.這個animal類就是我們的父類.

c語言多态的概念(C類和對象)7

c語言多态的概念(C類和對象)8

然後我們再去看,上面這個貓類,它繼承了父類animal類,

Cat類中重寫了,父類Animal類中的spreak()方法.

c語言多态的概念(C類和對象)9

c語言多态的概念(C類和對象)10

然後狗類,也重寫了animal中的spreak方法.

c語言多态的概念(C類和對象)11

c語言多态的概念(C類和對象)12

然後上面我們就是,通過地址晚綁定,動态多态的方式,實現了

我們給doSpreak方法,傳入我們的子類對象,用父類引用來接收,實現對

子類中的重寫方法的調用.

那麼這個過程的原理是什麼?

c語言多态的概念(C類和對象)13

c語言多态的概念(C類和對象)14

首先我們 去寫個test02方法,然後,調用test02方法,打印Animal類的size,大小.

c語言多态的概念(C類和對象)15

c語言多态的概念(C類和對象)16

首先我們去,打印animal這個父類的大小,但是打印之前我們先把

父類中的,spreak函數,前面的virtual,關鍵字,給删除掉.

我們再去打印.

c語言多态的概念(C類和對象)17

c語言多态的概念(C類和對象)18

執行可以看到,隻有個函數的地址對吧,可以看到animal這個時候的

大小是一個字節.用來區分對象用的.

c語言多态的概念(C類和對象)19

c語言多态的概念(C類和對象)20

然後如果我們在animal類的spreak方法前面,加上virtual這個關鍵字,然後再去打印.

c語言多态的概念(C類和對象)21

c語言多态的概念(C類和對象)22

我們再去看看,結果是4個字節了. 那麼這4個字節是什麼呢?

int float是4個字節?對吧 ....指針也是4個字節.

對這個4個字節,其實就是指針.

c語言多态的概念(C類和對象)23

c語言多态的概念(C類和對象)24

我們去看原理,當我們在Animal類中的spreak函數,前面,添加virtual關鍵字的時候,

我們可以看到,這個時候Animal類的内部結構是上面,右邊這樣的.

首先Animal中會有一個vfptr,這個指針,這個指針vfptr的意思是

v - virtual

f-function

ptr - pointer

是虛函數指針的意思.

然後這個vfptr指向的是vftable,這個虛函數表,這個表是幹什麼用的呢?

這個表是記錄了虛函數的地址.

c語言多态的概念(C類和對象)25

c語言多态的概念(C類和對象)26

比如,我們去看animal類的内部結構,可以看到,當我們在父類animal類中,的spreak函數的前面

添加virtual關鍵字的時候,他會産生一個vfptr,這個指針,這個指針會指向vftable一個虛函數表的地址,

然後這個表中,這個時候會存放animal類的,虛函數spreak()的地址,也就是&Animal::spreak.

當我們再去寫一個Cat類,來繼承這個Animal類的時候,在Cat這個子類中,去重寫Animal類中的spreak函數,

可以看到由于cat類繼承了Animal類,所以,在Cat類的結構中,也有個vfptr,然後這個vfptr,也是指向一個vftable表

,然後這個vftable表中,也是存放了一個&Animal::spreak 這個父類的spreak方法的指針,這個是繼承過來的.

c語言多态的概念(C類和對象)27

c語言多态的概念(C類和對象)28

然後這一步很重要,可以看到由于Cat重寫了父類中的spreak函數,所以,在Cat類的内部結構中的vftable,虛函數表中

繼承過來的&Animal::spreak函數的地址,就會被替換成&Cat::spreak

而這個過程是在,當我們,調用doSpreak,給參數Animal這個父類的引用,傳遞一個cat這個子類對象的時候,

發生的.

c語言多态的概念(C類和對象)29

c語言多态的概念(C類和對象)30

可以看到上面也說了,當父類的指針,或者引用,指向子類的對象的時候,就會發生多态,實際上就是,

會把繼承過來的,父類的&Animal::spreak,這個虛函數的指針替換成,

&Cat::spreak,這個子類的spreak的地址.

這樣就可以實現,我們執行的時候,傳入的是子類的對象,打印出來,就是子類對象中,重寫的那個spreak方法的内容了.

c語言多态的概念(C類和對象)31

c語言多态的概念(C類和對象)32

我們也可以打開工具去看一下具體情況.

c語言多态的概念(C類和對象)33

c語言多态的概念(C類和對象)34

首先我們去把virtual,關鍵字,删除掉.

c語言多态的概念(C類和對象)35

c語言多态的概念(C類和對象)36

可以看到,我們暫時把父類的虛函數spreak,前面的virtual删除掉.

c語言多态的概念(C類和對象)37

c語言多态的概念(C類和對象)38

我們找到對應的代碼文件

c語言多态的概念(C類和對象)39

c語言多态的概念(C類和對象)40

c語言多态的概念(C類和對象)41

用工具,走到對應文件,目錄,先查看一下,

c語言多态的概念(C類和對象)42

c語言多态的概念(C類和對象)43

然後我們,執行

cl /dl reportSingleClassLayoutAnimal "01 多态基本概念.cpp"

c語言多态的概念(C類和對象)44

c語言多态的概念(C類和對象)41

執行以後,可以看到這個時候如果我們不給父類的spreak函數,前面,添加virtual的情況,可以看到這個時候

animal類的大小是

size(1);1個字節.

c語言多态的概念(C類和對象)46

c語言多态的概念(C類和對象)47

然後我們再去打開,

animal類中的spreak方法,前面的virtual,然後再去用工具去查看一下Animal類的,結構

可以看到這個我時候size變成了4個字節,然後,裡面有vfptr,然後vfptr指針,指向

vftable這個虛函數表,然後可以看到虛函數表中,存着&Animal::spreak這個指針.對吧.

c語言多态的概念(C類和對象)48

c語言多态的概念(C類和對象)49

我們可以對着去看看,可以看到在Animal類中,當spreak前面加上virtual關鍵字的時候,類的結構就會有vfptr這個指針,然後

這個指針指向一個vftable這個虛函數表,然後

這個虛函數表中存放着&Animal::spreak這個父類中spreak函數的指針.

c語言多态的概念(C類和對象)50

c語言多态的概念(C類和對象)51

然後我們再去看看,當我們把Cat類中的,重寫的父類中的這個spreak函數,删除掉.

c語言多态的概念(C類和對象)52

c語言多态的概念(C類和對象)53

我們去查看Cat類的,對象結構去.

c語言多态的概念(C類和對象)54

c語言多态的概念(C類和對象)55

可以看到這個時候得到的結構,Cat類的大小是字節4個.裡面有個vfptr指針,

這個指針指向一個vftable虛函數表,然後

虛函數表,中存放了&Animal::spreak,這個父類的spreak函數的指針對吧.

因為我們在子類中沒有重寫父類的spreak函數.所以這裡,Cat類的虛函數表中,存放的是繼承過來的,父類的

&Animal::spreak函數的指針.

c語言多态的概念(C類和對象)56

c語言多态的概念(C類和對象)57

當我們把Cat類中的,重寫了父類中的是spreak的函數的注釋打開,然後我們再去執行分析一下.

c語言多态的概念(C類和對象)58

c語言多态的概念(C類和對象)59

可以看到這個時候

Cat類,的size大小還是4個字節,存放了vfptr,這個指針,然後這個指針指向了vftable,這個虛函數表

然後這個虛函數表中,注意,這時候,存放的指針,就是

&Cat::spreak,這個Cat子類中的spreak函數了.

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
管理人員到現場的工作方式(現場管理
管理人員到現場的工作方式(現場管理
  01 管理者工作任務概述   班組長有自己開展的業務,主任、廠長同樣需要開展對應的業務,讓企業向更高目标挑戰,并達到這一目标後能乘勝前進。在專業化分工的要求下,分擔、輔佐經營領導人的經營管理功能就是管理者的任務。現場管理者一般是主任、廠長這樣車間負責人。   1、管理者擔負着管理業務與管理人的兩個方面主要任務。   一是實現從公司發展方針中下達的“長、中...
2025-07-19
産品經理如何管理好團隊(從10大管理看産品經理的日常工作)
産品經理如何管理好團隊(從10大管理看産品經理的日常工作)
  項目經理和産品經理有一定的共性,一方面,項目的産物之一就是産品;另一方面,項目的管理體系與産品管理體系有一定的共通性和重合性。本文作者結合項目10大管理的思路,整理了産品的10大管理,一起來看一下吧。      産品經理這個職業有其特殊性,在學校,沒有專門的專業或課程教授你如何成為一名産品經理,雖然我們給産品經理劃分了初級、中級、高級,但是卻沒有相應的職...
2025-07-19
遊戲主播電競選手雙男主文(原耽推文:主播撿到一隻電競大神然後主播就去打職業了)
遊戲主播電競選手雙男主文(原耽推文:主播撿到一隻電競大神然後主播就去打職業了)
  啦啦啦,小女又來啦!!!   親愛的小仙女們,歡迎來到小女的小小天地,小女,一個小甜文愛好者,緻力于看遍好看的小說,把自己看到的好看的推薦給小仙女們,人送外号“人肉排雷機”(其實是自封的)。   喜歡小女這種負責任分享小說,不用等着别人排雷的小仙女可以關注小女呀,每天都有小說看!不用放屁股等踢啦!   ——————☞☜——————      《撿到一隻電...
2025-07-19
雲浮家校協作攜手迎開學(兩校合并一家親)
雲浮家校協作攜手迎開學(兩校合并一家親)
     紅網時刻新聞8月30日訊(通訊員 易小旭)8月30日上午,邵陽市十五中、十六中在一中老校區行政樓二樓教工會議室召開秋季開學工作會議。   會議指出,本次會議是兩校重啟合并的首個工作會議,具有裡程碑的意義。兩所學校的合并,既是政策的需要,也是學校謀求長遠發展的重大舉措,有利于優化教育資源配置,進一步推動邵陽教育發展。希望全體教工充分理解,凝心聚力,以...
2025-07-19
魯迅每月300大洋相當于現在多少錢(魯迅每月的工資是350塊大洋)
魯迅每月300大洋相當于現在多少錢(魯迅每月的工資是350塊大洋)
  對于一份工作的好壞,人們最關心的往往是工資,然後才是工作環境、晉升途徑、企業文化等,這也就是為什麼一些互聯網企業推行殘酷的996制度,但還是被很多人趨之若鹜,高工資是這些企業吸引優秀求職者的重要方式。民國時期,高校教師也是一個非常受人歡迎的職業,主要原因是人們普遍尊重教師,并給予了他們很高的待遇。   人們很推崇的思想家、文學家和教師魯迅,他當時的工資是...
2025-07-19
Copyright 2023-2025 - www.tftnews.com All Rights Reserved