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樓:
如果派生類新增了另外的虛函式則父類物件不會擁有派生類物件額外定義的虛函式指標,呼叫結果不確定,最大的可能是程式崩潰!
3樓:匿名使用者
如果基類宣告的是虛函式就呼叫基類的,如果不是虛函式並在派生類中實現,就呼叫派生類的函式
這就是虛函式的作用
c++中基類指標指向派生類物件可以呼叫派生類的新增成員麼
4樓:匿名使用者
no!基類指bai針告訴du
編譯器它的靜態類zhi型是基類這種型別dao,所以限定了這個指標回只能呼叫基類的自有
答成員。這個其實無關於他指向什麼型別物件。
但是,你作為這個指標的寫作者,你當然知道這個基類指標指向的是派生類物件。所以,可以將這個基類指標強制轉換為派生類指標(就是強制編譯器把這個指標靜態型別看作派生型別),靜態型別表明了乙個物件 能執行的所有動作(成員函式)+它的自有屬性(資料成員),這樣派生類的新增成員就可以被這個指標呼叫了
動態繫結的重寫基類的virtual方法並不是派生類新增成員,而是重寫(override)。
5樓:欲動精靈
可以 其實這就是動態繫結嘛
該指標所繫結的物件就是派生類物件,它當然可以呼叫派生類的所有公有介面
c++基類指標指向派生類物件
6樓:匿名使用者
//動態聯編與虛函式。
//動態繫結聯編工作在程式執行時執行,在程式執行時才確定將要呼叫的函式。虛函式是動態繫結的基礎。
//是非靜態的成員函式。
//在類的宣告中,在函式原型之前寫virtual。
//virtual 只用來說明類宣告中的原型,不能用在函式實現時。
//具有繼承性,基類中宣告了虛函式,派生類中無論是否說明,同原型函式都自動為虛函式。
//本質:不是過載宣告而是覆蓋。
//呼叫方式:通過基類指標或引用,執行時會根據指標指向的物件的類,決定呼叫哪個函式。
#include
class b0 //基類b0宣告
void main() //主函式
7樓:匿名使用者
因為這個函式你沒有宣告為虛函式。
C 基類指標指向派生類指標時,指標可以用派生類的非虛方法嗎
需要知道一些常識,一個類所有的函式都是再code 區中唯一的存放一份。而資料成員則是每個物件儲存一份,並按照宣告順序依次存放。類a中有了虛擬函式就會再類的資料成員的最前面新增一個vfptr指標 void vfptr 這個指標用來指向一個vtable表 一個函式指標陣列 一個類只有一個該表 該表儲存著...
關於c基類派生類的引用和指標,關於C 基類 派生類的引用和指標
1 首先回答第一個問題 用基類的指標指向派生類的物件,這樣做可以體現c 的重要特性 多型性。多型性其實也就是動態聯編。這樣做的好處是 當基類裡面定義了一個虛成員函式的時候,其派生類裡面定義了同名的函式可以實現覆蓋。你的基類指標指向那個物件,就呼叫那個物件的該方法。我舉個例子你應該就明白了 class...
C派生類繼承基類的所有成員,包括基類的私有成員
樓主你好。答案就是 繼承了,但是無法訪問。為什麼呢?我們用乙個例子來證明。比如我們有個基類 public class a 它有乙個私有成員name,和乙個保護的方法getname 然後我們寫個空類來繼承他 public class b a 好了,如果我們例項化這個類,並呼叫getname方法,並輸出...