設計知識點:
指標型別強制轉換(挑戰你的腦迴路)
虛函式表
#include
using namespace std;
//m g f j goh//總共有七個,不重複有留個.
/*依照邏輯來看(僅僅)b物件虛函式表構成.gf
jmg《這個實際上被重寫了》oh
*/class h
};class a
private:
virtual void f()
virtual void j()
};class b : public a,public h
virtual void o()
virtual void h()
/*virtual void m()
*/virtual void my()
};typedef void(*fun)(void);
struct hello
;//h a b:ah
void main()
fun pyuan = (fun)*(int *)*((int*)(&b) + 1);
pyuan();
/*錯誤理解:寫給自己看備註的筆記
實際上還是概念錯誤,這裡地方實際強轉來強轉去容易犯暈.
虛表實際上是個二維陣列的概念:弄了半天終於弄透了,實際上是換種方式的二維陣列.
本來想變換寫法的:實際上這個將以為陣列首位址強轉了.
void *p = (void *)(*((int*)(&b) + 1));
fun pfun1 = (fun)p;
*///這裡執行了b類中的自己的虛函式《非派生》
pfun = (fun)*((int*)*(int*)(&b) + 5);
pfun();
/*最終總結:
依題說題《因為這方面是編譯器決定的機制:關於虛表是否在對錢記憶體起始處和虛表相關規則的建立,僅僅依照此**得到相關結論,理解機制即可》
1.派生類會為每個基類建立不同的虛表乙個類乙份//算了,把這種說法槍斃掉,由編譯器和平台決定,所幸就具體化來說
1.b類繼承了a和h類.依照我記憶體觀察.b類中就分配了8位元組存放a和h虛表所在位置位址.《也就是一人四個位元組指定它們各自以為陣列位置》
2.b類有自己自定義的虛函式,依照我的觀察,它機制所幸就將那個函式放到當前物件的a虛表中了.
下面鏈結收藏一篇講解詳細的:可以自行轉彎檢視:
虛函式表分析
project100.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include pch.h include using namespace std 父類 class base virtual voidg virtual voidh class derive public bas...
虛函式之虛函式表
多型性可分為兩類 靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,動態多型性是通過虛函式實現的。每個含有虛函式的類有一張虛函式表 vtbl 表中每一項是乙個虛函式的位址,也就是說,虛函式表的每一項是乙個虛函式的指標。沒有虛函式的c 類,是不會有虛函式表的。兩張圖 簡單例子 inclu...
虛函式表指標,虛函式表
對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...