关于c++在内存布局意义下使用派生类指针访问基类
2013-02-14 11:01
435 查看
首先,让我们了解一下c++的内存布局吧~
c++类的构成
c++类的继承方式
在内存中c++的类是如何构成的呢:
分两种情况:
1.一般的继承(不包括虚拟继承)
在这种情况下:c++类中的静态成员,静态方法,非静态方法都不在c++对象的内存布局中,其内存布局是
注意的地方:
1.vfptr是虚拟函数的入口地址,真正的虚拟函数的地址是vfptr的指向的数组的内容。
2.派生类的虚拟函数被柔和进了第一张vfptr表的末尾。
3.派生类的虚拟函数要覆盖基类的虚拟函数。
2.含有虚拟继承的情况
这种情况下:内存布局是
注意的是:
1.虚拟继承的部分包括两方面:真正的虚拟继承类(vitual)以及在非虚拟继承的部分中基类所继承的相同的虚拟父基类
2.vbptr是针对虚拟继承的,vfptr是针对虚拟函数的
利用派生类的指针访问基类的要点:
1.声明函数指针
典型的是
typedef void (*fun)()
2.将派生类的对象转化成指针
int *ptr=(int*)child
3.将某个地址转化成函数指针
pfun=(fun)ptr[0];
注意区别内存的内容是
函数指针还是函数指针数组的首地址!!!!!!!
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];
注意区别内存的内容是
函数指针还是函数指针数组的首地址!!!!!!!
相关文章推荐
- 详谈C++中虚基类在派生类中的内存布局
- C++中使用内存映射文件存取struct,并用指针访问
- C++对象内存布局--虚基类表的使用
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析
- 关于C++基类、派生类的引用和指针(动态绑定和静态绑定)
- C++中虚基类在派生类中的内存布局
- C++中使用内存映射文件存取struct,并用指针访问
- C++的继承操作---基类指针访问派生类问题---基类成员恢复访问属性问题
- c++的意义。。(个人感觉使用c++可以接触到软件的本质,虽然不能直接开发快速但你可以有自由的感觉,尤其是指针,和直接贴近内存的本质)
- C++对象内存布局--虚基类表的使用
- c++中使用基类指针Vector 存放子类对象(0xcccccccc 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突 )
- 关于C++基类、派生类的引用和指针
- C++基类指针指向的派生类对象内存的释放
- 详谈C++中虚基类在派生类中的内存布局
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析(解决面试宝典第四版P147问题)
- C++中使用基类指针调用派生类中定义的方法
- c++ 基类、派生类都使用了动态内存分配的实例
- C++ 基类、派生类对象指针的声明与使用
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析
- c++中基类与派生类中隐含的this指针的分析