編碼踩過的坑(虛介面)

2021-08-10 16:58:34 字數 1061 閱讀 8556

本文介紹,由於虛函式的呼叫機制,導致的虛函式呼叫異常。

c++對外提供的介面,一般以介面類的public方法體現,如下:

class inte***ce;
如果在inte***ce中新增乙個方法(比如叫functiond),那麼建議將新增的方法放在最後面。這樣就算使用inte***ce介面的**沒有重新編譯,也不會影響到inte***ce中老方法的使用。

虛函式的呼叫,依賴虛表(vtbl)和虛表指標(vptrs)。每個包含(或繼承)虛函式的類,都有乙個虛表,虛表是個指向類中各個虛函式的指標陣列(或鍊錶);

包含(或繼承)虛函式類的物件,都有乙個隱藏的成員,這個成員指向就是虛表指標,它指向對應類的虛表。

以上面**中的inte***ce類為例。如果此類的虛表叫inte***ce_vtbl,其內容應該為:

inte***ce_vtbl[0] 指向 inte***ce::functiona()

inte***ce_vtbl[1] 指向 inte***ce::functionb()

inte***ce_vtbl[2] 指向 inte***ce::functionc()

那麼,虛函式的呼叫實際是這樣的:

inte***ce obj_i;

obj_i.functionb();

// 上面一行的偽**為:

obj_i.vptrs[1](&obj_i); // &obj_i作為functionb()的this指標

回到增加乙個新的方法functiond:
class inte***ce;
將functiond放在functiona的後面,而inte***ce以標頭檔案和目標檔案的形式提供給下游模組。

如果下游模組沒有重新編譯,而是直接鏈結,想想下游模組呼叫functionb的時候,會出現什麼情況。

實際上,呼叫functionb的時候,會走到functiond中。

這類情況,在多個模組協作編譯鏈結的軟體專案中,可能會出現。因此在實際中,建議將新的虛方法,放在最後。這樣至少在不使用新方法的一些模組中,不會出現虛表指標跑飛的情況。

Python 編碼踩坑小記

coding utf 8 print repr u 我愛你 print repr u u6211 u7231 u4f60 print repr u 我愛你 encode utf 8 print 內容utf 8實際unicode使用下面兩種都可以編碼成功 print repr u xe6 x88 x9...

Flask 寫介面中文亂碼踩坑記

在經歷了與編碼報錯和亂碼的鬥智鬥勇後,寫下此記 萬惡的報錯資訊 json.decoder.jsondecodeerror expecting value line 1 column 1 char 0 出現此報錯資訊出現問題的地方可能在於以下兩點 dict 和 json 不一樣!不一樣 不一樣 dic...

踩過的坑和以後要避免的坑之 後台介面

httpservletrequest request這種一般都不傳進去。最多獲取乙個 管理員的 id 才有用 跟登入無關的方法邏輯就不用傳token entity和dto的字段不需要一定一致 dto在我的理解裡是一種包裹資料的殼 errorlogdao.msg cardentityparams ca...