C 程式設計思想之虛函式

2021-08-04 23:38:01 字數 1003 閱讀 2563

通過動態庫dlsym乙個類,如果這個類有虛函式,外面引用的標頭檔案和類中定義的標頭檔案虛函式宣告順序不一樣,會不會有問題?

例如:

dynamiclib.h

class a

;class b : public a

int funcb()

int funcc()

}extern 「c」

a* getinstanceofa()

android.mk將其編譯成乙個動態庫libdynamic.so

如果我們在使用libdyanmic.so都時候,提供了乙個錯誤的標頭檔案,

dynamiclib_err.h

class a

;int main()

列印如下:

b::funcb()

b::funcc()

b::funca()

虛函式在虛函式表中是按宣告順序排列的,是通過虛函式表來呼叫的。

那如果不是純虛函式,是否能正確列印呢?通過驗證發現,如果某個函式不是純虛函式,而被呼叫到,本身無法編譯通過,所以如果要通過dlsym出乙個類,這個類的所有函式都應該是純虛函式。

20180824:今天工作中又出現一次,和前面分析是吻合的,

今天出現的案例是演算法庫中的標頭檔案和定義正確的標頭檔案相比沒有對齊,少了乙個函式,由於虛函式在虛函式表中是按宣告順序排列的,所以呼叫func2的時候會呼叫到前面的那個虛函式func1,

這次func1引數列表中需要傳入陣列指標指標,結果直接報空指標解析crash了

宣告:virtual void func1(int* a) = 0 ;

virtual void func2() = 0;

定義: void func1(int* a)

void func2()

本來如果是正確呼叫func2的話,func2是沒有函式引數入棧的,但func1被呼叫起來之後,它會按照規則去找壓棧的入參,而且是指標,再在錯誤位址解析,位址正好是0,然後解析就出現crash了

OOP思想之虛函式表分析

設計知識點 指標型別強制轉換 挑戰你的腦迴路 虛函式表 include using namespace std m g f j goh 總共有七個,不重複有留個.依照邏輯來看 僅僅 b物件虛函式表構成.gf jmg 這個實際上被重寫了 oh class h class a private virtu...

C 之虛函式

若乙個例項方法宣告前帶有virtual關鍵字,那麼這個方法就是虛方法。虛方法與非虛方法的最大不同是,虛方法的實現可以由派生類所取代,這種取代是通過方法的重寫實現的 以後再講 虛方法的特點 虛方法前不允許有static,abstract,或override修飾符 虛方法不能是私有的,因此不能使用pri...

C 之虛函式

引入原因 為了方便使用多型特性,我們常常需要在基類中定義虛函式。class cman void move private class cchild public cman private cman m man cchild m child cman p 虛函式的使用精髓,如果不定義基類的指標去使用,...