您的位置:首页 > 编程语言 > C语言/C++

关于C++中父类指针引用对象在内存中的分布

2015-09-05 22:18 459 查看
通过程序,这是我自己的理解,如果不对,麻烦帮忙指出来

程序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字节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: