首先,让我们了解一下c++的内存布局吧~
c++类的构成
成员 | 方法 |
静态 | 静态 |
非静态 | 非静态 |
虚拟 |
c++类的继承方式
无继承 |
单继承 |
多继承 |
虚拟继承 |
在内存中c++的类是如何构成的呢:
分两种情况:
1.一般的继承(不包括虚拟继承)
在这种情况下:c++类中的静态成员,静态方法,非静态方法都不在c++对象的内存布局中,其内存布局是
第一个基类的vfptr |
第一个基类的非静态成员 |
第二个基类的vfptr |
第二个基类的非静态成员 |
派生类的非静态成员 |
1.vfptr是虚拟函数的入口地址,真正的虚拟函数的地址是vfptr的指向的数组的内容。
2.派生类的虚拟函数被柔和进了第一张vfptr表的末尾。
3.派生类的虚拟函数要覆盖基类的虚拟函数。
2.含有虚拟继承的情况
这种情况下:内存布局是
非虚拟继承的部分 |
vbptr |
派生类的成员 |
虚拟继承的部分 |
注意的是:
1.虚拟继承的部分包括两方面:真正的虚拟继承类(vitual)以及在非虚拟继承的部分中基类所继承的相同的虚拟父基类
2.vbptr是针对虚拟继承的,vfptr是针对虚拟函数的
利用派生类的指针访问基类的要点:
1.声明函数指针
典型的是
typedef void (*fun)()
2.将派生类的对象转化成指针
int *ptr=(int*)child
3.将某个地址转化成函数指针
pfun=(fun)ptr[0];
注意区别内存的内容是
函数指针还是函数指针数组的首地址!!!!!!!