C 基類指標指向派生類指標時,指標可以用派生類的非虛方法嗎

2021-09-17 08:22:42 字數 851 閱讀 8676

1樓:匿名使用者

需要知道一些常識,乙個類所有的函式都是再code**區中唯一的存放乙份。而資料成員則是每個物件儲存乙份,並按照宣告順序依次存放。

類a中有了虛函式就會再類的資料成員的最前面新增乙個vfptr指標(void** vfptr),這個指標用來指向乙個vtable表(乙個函式指標陣列)(乙個類只有乙個該錶),該錶儲存著當前類的所有 虛函式 的位址。這樣vfptr就成為了乙個類似成員變數的存在。訪問虛函式的時候通過vfptr間址找到vtable表,再間址進而找到要呼叫的函式。

這樣就在一定程度上擺脫了型別制約。

只要vptr的值不同,那麼訪問函式成員的時候使用的vtable表就不同,就可能訪問到不同類的函式成員。b類物件中的vptr指向b類自己的vtable。

當b類繼承a類的時候,因為a中有虛函式,編譯器就自動的給b類新增vfprt指標和vtable表。也可以理解為b類繼承來了a類中的那個vptr指標成員。

當a類指標指向b類物件時,發生假切割。要知道這個過程只是切掉a類中沒有的那些成員,由於vptr是從a類中繼承來的,所以這個量仍將保留。而對於vptr的值則不會改變,仍然指向b類的vtable表。

所以訪問f1函式的時候是通過b類的vtable表去定址的,自然就是使用子類的函式。

當b類的指標指向a類的物件時(當b類存在新增資料成員時可能出錯),同理。

而對於普通函式則受型別的制約,(因為沒有vptr指標)使用哪個類的指標呼叫函式,那麼所呼叫的就是那個累的函式。

總而言之,普通函式通過物件或指標的型別來找所呼叫的函式,而虛函式是通過乙個指標來找到所要呼叫的函式的。

2樓:你是我的好嘛萱

and much toil. in fact

C類的物件和類的指標的區別,指標和引用的區別

c 物件是類的示例,當定義乙個類的時候,系統是不為這個類分配空間的,只有當定義類的物件的時候才會分配空間,類的物件實際上就是類空間的引用。指標是用來儲存變數的位址。區別 指標和引用的區別 指標指向一塊記憶體,它的內容是所指記憶體的位址 引用 是某塊記憶體的別名。指標版 是乙個實體,而引用僅是個別名權...

請問c中在派生類中若要訪問基類成員要使用什麼關鍵字

直接訪問就行了,若是派生類覆蓋了同名的基類成員則使用 作用域解析運算子即可,若基類的成員是私有的則派生類是無法訪問基類的成員的。示例 class a class b public a void main 如果是基類的public或protected成員,直接訪問即可 如果是private成員,則不能...

如果獲取類的指標

你 定義的是 csplitterview m psplitterview 放在 csplitterview oncreate 裡 m psplitterview this csplitterview m psplitterview 這個定義要放在外部 getactivepane的兩個引數,第乙個表示...