c++知識點:這個類A 是一個含有虛函數的類,那麼此時運行時編譯器會為他生成虛表,並且在A類的對象內存的起始位置加了虛表的首地址,所以此時對象的大小會比
不含有虛函數的類對象多了4個字節(32位機下),因為編譯器需要通過這個指針去運行時尋找虛表。
然後看看你的代碼:
在你的a對象的前四個字節存的是虛表的首地址(32位機,64位為8字節), 此事聲明了一個函數指針類型,fp, 然後定義一個此類型的變量myfunc
然後myfunc = (*((int*)*((int*)&a))); 這一行代碼是最核心的,也是最難理解的。下面我用文字敘述“=”右邊的表達式: 由內到外先對a對象取地址運算
然後轉成int*類型,再取*運算,這一步就得到了a的前四個字節,也就是以上說的虛表的首地址。最後在轉再取*運算主要是將myfunc關聯到test函數入口
地址上面。這樣的話你調用myfunc();就找到了虛表裡面的test函數。達到間接調用的目的。