关于C++中父类指针引用对象在内存中的分布
2015-09-05 22:18
459 查看
通过程序,这是我自己的理解,如果不对,麻烦帮忙指出来
程序1
而如果稍微改下程序
程序2:
在程序1中,A是父类,B继承A,然后C继承B,在生成的aObject对象时在内存中只有一个虚函数表,而且是在对象内存的最开始处,虚函数表中有
三个虚函数,在父类指针引用时均指向该虚函数表,在动态绑定时根据该虚函数表查找具体的函数。
而在程序2中,A,B均为父类,然后C分别继承A和B,在生成aObject对象时内存中有两个虚函数表,第一个包含子类本身的虚函数以及第一个父类的虚函数有
所以pA,pC均指向最开始的虚函数表
而第二个虚函数表中只有父类B的虚函数
程序1
#include <IOSTREAM> using namespace std; class ClassA { public: virtual ~ ClassA(){}; virtual void FunctionA(){}; int a; int b; }; class ClassB: public ClassA { public: virtual void FunctionB(){}; int a; int b; }; class ClassC : public ClassB { public: int a; int b; }; int main() { ClassC aObject; ClassA* pA=&aObject; ClassB* pB=&aObject; ClassC* pC=&aObject; return 0; }运行后发现pA=pB=pC;
而如果稍微改下程序
程序2:
#include <IOSTREAM> using namespace std; class ClassA { public: virtual ~ ClassA(){}; virtual void FunctionA(){}; int a; int b; }; class ClassB { public: virtual void FunctionB(){}; int a; int b; }; class ClassC : public ClassA,public ClassB { public: int a; int b; }; int main() { ClassC aObject; ClassA* pA=&aObject; ClassB* pB=&aObject; ClassC* pC=&aObject; return 0; }则有pA=pC, pB-pA=12=4*3;
在程序1中,A是父类,B继承A,然后C继承B,在生成的aObject对象时在内存中只有一个虚函数表,而且是在对象内存的最开始处,虚函数表中有
~ ClassA,<pre name="code" class="cpp">FunctionA(),<pre name="code" class="cpp">FunctionB()
三个虚函数,在父类指针引用时均指向该虚函数表,在动态绑定时根据该虚函数表查找具体的函数。
而在程序2中,A,B均为父类,然后C分别继承A和B,在生成aObject对象时内存中有两个虚函数表,第一个包含子类本身的虚函数以及第一个父类的虚函数有
~ ClassA(){},<pre name="code" class="cpp">virtual void FunctionA()
如果C也有虚函数也会在此虚函数表中
所以pA,pC均指向最开始的虚函数表
而第二个虚函数表中只有父类B的虚函数
virtual void FunctionB()而且在两个虚函数表间还有父类的成员,所以pb-pa=12,中间间隔一个虚函数表地址4字节,然后有两个整型变量4字节。
相关文章推荐
- c语言学习第二天
- 最值得你所关注的10个C语言开源项目(转自红联)
- C++_运算符重载
- C/C++中的static使用
- c语言基础学习记录第一天
- C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅳ部分
- c++的深拷贝和浅拷贝
- C++的抽象类理解
- 提高C++程序运行效率的10个简单方法
- c++primer之顺序容器(访问元素)
- C/C++ struct/class/union内存对齐 [转]
- const在c++中的用法分析
- C++技术点积累(1)
- 【C++】嵌套类、友元
- 在C#中使用C++编写的类
- c语言学习之顺序结构
- C/C++笔试题目大全
- 编辑距离
- C++继承实例
- 【C++】实现STL模板类string