C 多型原理詳解(GDB除錯分析)

2021-09-25 04:57:24 字數 2915 閱讀 5073

)在計算類大小時提及到了類中虛指標及虛函式表的結構,但並沒有相對較為充足的依據,下來借助gdb工具來分析一下c++中虛指標及虛函式表的詳細結構(以下**執行環境均為linux下的64位作業系統)。

無繼承的單類案例**如下:

#include using namespace std;

class a

virtual void fun2(){}

virtual void fun3(){}

};int main()

gdb除錯結構結果及分析如下:

此時物件a記憶體布局結構如下:

單繼承無覆蓋的類案例**如下:

#include using namespace std;

class a

virtual void fun_a2(){}

virtual void fun_a3(){}

};class b : public a

virtual void fun_b2(){}

virtual void fun_b3(){}

};int main()

gdb除錯結構結果及分析如下:

此時物件b記憶體布局結構如下:

單繼承有覆蓋的類案例**如下:

#include using namespace std;

class a

virtual void fun_a2(){}

virtual void fun_a3(){}

};class b : public a

virtual void fun_b2(){}

virtual void fun_b3(){}

};int main()

gdb除錯結構結果及分析如下:

此時物件b記憶體布局結構如下:

多繼承無覆蓋的類案例**如下:

#include using namespace std;

class a

virtual void fun_a2(){}

virtual void fun_a3(){}

};class b

virtual void fun_b2(){}

virtual void fun_b3(){}

};class c : public a, public b

virtual void fun_c2(){}

virtual void fun_c3(){}

};int main()

gdb除錯結構結果及分析如下: 

此時物件c記憶體布局結構如下: 

多繼承有覆蓋的類案例**如下:

#include using namespace std;

class a

virtual void fun_a2(){}

virtual void fun_a3(){}

};class b

virtual void fun_b2(){}

virtual void fun_b3(){}

};class c : public a, public b

void fun_b2(){}

void fun_a3(){}

};int main()

gdb除錯結構結果及分析如下:

此時物件c記憶體布局結構如下: 

結論:帶有虛函式的類物件中都存在乙個虛指標指向對應物件類的虛函式表。派生類物件自己的虛指標與其繼承順序的第乙個基類的虛函式表指標合併。此外若派生類重寫了第乙個基類中同名的虛函式,則在對應虛函式表的對應位置予以修改,若重新了其它非第乙個基類中同名的虛函式,則將其新增至第乙個虛函式表的最後面,包括派生類自己的定義虛函式也如此,並將其它非第乙個基類中同名的虛函式致為無效函式。

GDB除錯原理

gdb偵錯程式可以啟動某些程序,然後對其進行除錯,或者將自己本身關聯到乙個已存在的程序之上。它可以單步執行 設定斷點然後執行程式,檢查變數的值以及跟蹤呼叫棧等等。gdb通過乙個系統呼叫 ptrace 接管乙個程序的執行 ptrace系統呼叫是乙個功能眾多且相當複雜的工具,能允許乙個程序控制另乙個程序...

GDB除錯詳解

gdb除錯命令 linux下的c 程式開發,makefile,cmake等編譯工具最終都是呼叫gcc這一編譯工具組。一般要除錯某個程式,為了清晰地看到除錯的每一行 呼叫的堆疊資訊,變數名和函式名等資訊,需要除錯程式含有除錯符號資訊。那麼判斷乙個可執行程式是否帶有除錯資訊?gdb hello worl...

C 多型實現原理詳解

c 的多型性用一句話概括就是 在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式 如果物件型別是基類,就呼叫基類的函式 1.用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2.存在...