看着网上的有些个博客写的也不太准确;
虚函数表指针,是虚基类的一个成员,是一个指针;使用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
}