看着网上的有些个博客写的也不太准确;
虚函数表指针,是虚基类的一个成员,是一个指针;使用gdb看时,这个指针被归到了基类块。 这个指针放在类定义的起始位置。对象的起始位置。
所以派生类对象的内存布局是:
SubClass { BaseClass1{ vtable *; BaseClass members;按照类定义里的顺序 } SubClass members; } class A { virtual void fun1(){}; int a; int b; }; class B { virtual void fun1(){}; int a; int b; }; class C:A,B { virtual void fun1(){}; int c; int d; }; (gdb) p *c $2 = { <A> = { _vptr.A = 0x4026b8 <vtable for C+16>, 虚函数表在 C 类定义的这个位置 如果又两个 相同的虚函数在两个基类里,其实用的是第一个的。 a = 0, b = 0 }, <B> = { _vptr.B = 0x4026d0 <vtable for C+40>, 虚函数表在C 类定义的这个位置 a = 0, b = 0 }, members of C: c = 0, d = 0 }