虚函数的实现是通过虚表(vtable)管理被重写了的函数,通过虚表指针(vptr)指向虚表。
当一个类A实现了多态的时候,与不使用多态机制的写法相比会多出一个sizeof(void*)的长度,多出的这个长度就是虚表指针,在对象中,虚表指针位于对象地址的起始位置。
class Base {
public:
int a;
int b;
virtual void func() {}
};
class Dred : public Base {
public:
int a;
int b;
void func() {}
};
int main()
{
cout << "sizeof(Base): " << sizeof(Base) << endl;
cout << "sizeof(Dred): " << sizeof(Dred) << endl;
Dred dr;
dr.a = 5678;
dr.b = 3412;
dr.c = 100;
dr.d = 678;
int* p = reinterpret_cast<int*>(&dr); //取虚表指针
//cout << "p: " <<
p += sizeof(void*) / sizeof(int); //跳过虚表指针
cout << "a: " << *p << endl;
cout << "b: " << *(p+1) << endl;
cout << "c: " << *(p+2) << endl;
cout << "d: " << *(p+3) << endl;
return 0;
}
输出
sizeof(Base): 16
sizeof(Dred): 24
a: 5678
b: 3412
c: 100
d: 678
未完待续。。。。