【c++】虚函数vtable理解

相关知识点

  • 二级指针

  • 不同指针类型的解引用

  • 指针类型转换

二级指针

如果一个内存段存储的是一个指针,则指向该内存段的指针至少是一个二级指针。及若*p为地址,则p至少是一个二级指针。而*p为非地址,则p为一级指针。

不同类型指针的解引用

p为int型指针,则*p解引用的地址长度范围为4个字节;而如果p为一个对象b的指针,则*p解引用的地址长度范围为sizeof(b)

指针类型的转换

如果b为一个对象,则(int*)(&b)将对象指针类型转换为int型指针;(int**)*(int*)(&b)将b中的前四个字节转换为int型二级指针。

指针类型转换

class B{
public:
virtual void f();
virtual void g();
virtual void h();

private:
int a;
int b;
int c;
};

int main{
B b;
cout<<"对象b的起始地址"<<&b<<endl;
cout<<"对象b的虚函数表表头地址"<<(int**)*(int*)(&b)<<endl;
cout<<"虚函数表的第0个函数f()的地址"<<*((int**)*(int*)(&b)+0)<<endl;
cout<<"虚函数表的第1个函数g()的地址"<<*((int**)*(int*)(&b)+1)<<endl;
cout<<<<"虚函数表的第2个函数h()的地址"<<*((int**)*(int*)(&b)+2)<<endl;
}
  • 下图p为虚函数表的表头地址,由下图可以看出*(p+0)为第一个虚函数的地址。
    二级指针p

猜你喜欢

转载自blog.csdn.net/Hollybobo79/article/details/89735834