你可以使用gcc的-fdump-class-hierarchy
選項,它會給你vtable的信息,但是輸出可能非常冗長而難以閱讀。
例如,給出下面的瑣碎類:
class Base {
public:
virtual int method() = 0;
};
class Derived : public Base {
public:
int method() {
return 10;
}
};
相關的輸出是
Vtable for Base
Base::_ZTV4Base: 3u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI4Base)
16 (int (*)(...))__cxa_pure_virtual
Class Base
size=8 align=8
base size=8 base align=8
Base (0x7f14c308ccc0) 0 nearly-empty
vptr=((& Base::_ZTV4Base) + 16u)
Vtable for Derived
Derived::_ZTV7Derived: 3u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI7Derived)
16 (int (*)(...))Derived::method
Class Derived
size=8 align=8
base size=8 base align=8
Derived (0x7f14c2ee7208) 0 nearly-empty
vptr=((& Derived::_ZTV7Derived) + 16u)
Base (0x7f14c308cd20) 0 nearly-empty
primary-for Derived (0x7f14c2ee7208)
這應該給你一個想法,地址範圍debuggng等
我對此不是100%,所以我不會將它作爲答案發布,但它應該足以查看'((void *)this)-1'(指針長度* *之前*這個')得到一個指向實際函數的指針(0終止的?)指針數組。他們不會攜帶方法名稱或任何東西,但這確實是所有的虛擬表格。 – Blindy
您是否使用Valgrind或任何類似的工具來分析您的代碼? –
你怎麼知道你最終在一個不同的功能?你在調試或輸出一些東西嗎? –