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

2021-09-17 08:22:43 字數 851 閱讀 9268

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 中基類指標指向派生類時,呼叫的虛擬函式是派生類的,為什麼要這樣啊

直接用子類物件呼叫函式當然沒問題,基類指標指向派生類物件是多型性的體現。什麼是多型呢?多型就是不同物件接受相同的訊息,但是卻產生不同的行為,舉一個很簡單的例子,有一個圖形類,他有幾個派生類,如圓形,三角形,矩形。圖形類有一個函式area 用來求面積,但是由於不同圖形求面積的方法不同,要由具體的派生類...

派生類可以呼叫基類的私有成員嗎,派生類能否直接訪問基類的私有成員若不能,應如何實現

派生類不bai能對基類 私du有成員進行訪問。要在派生類zhi 中對基dao類成員回進行訪問,可以 1,在答派生類中對基類成員的public屬性進行訪問,以間接訪問基類的私有成員 2,在基類中將私有成員定義為protected訪問屬性,以在派生類中直接對其進行訪問。當位於類成員列表之前時,priva...

C派生類設計

include using namespace std include class document 建構函式 document string title,int num double getmoney class book public documentbook string title,int ...