C++对象在内存中的存储

最近忽然迷惑,子类继承父类之后,子类对象在内存中的存储方式是怎样的。理论上上应该是虚函数表指针、父类变量、子类变量。父类变量存储时是否和子类变量一起实现内存对齐呢?

为了搞明白这个问题,做了如下实验。

编译环境:win32,VS2008,Version3.5 SP1

#include "stdafx.h"
#include<iostream>

using namespace std;

class A
{
public:
A(char ch){m_a = ch;}
virtual void funcA(){cout<<"virtual funcA"<<endl;}
public:
char m_a;

};

class B:public A
{
public:
B(char ch):A('A')
{
m_b = ch;
m_b1 = ch;
}
virtual void  funcB(){cout<<"virtual funcB"<<endl;}
public:
char m_b;
char m_b1;
};


int _tmain(int argc, _TCHAR* argv[])
{
A a('A');
B b('B');
int aa = 0;
typedef void (*FUNCP)(void) ;
       FUNCP fpA = NULL, fpB = NULL;

int *p = NULL;
int *pp = NULL;
printf("sizeof(A) = %d\n",sizeof(a)); // 8
printf("sizeof(B) = %d\n",sizeof(b)); // 12


printf("address of a = %0x\n",(long)&a);   // 2dfb54
printf("address of a.m_a = %0x\n",(long)&a.m_a); // 2dfb58

printf("address of b = %0x\n",(long)&b);//2dfb40
printf("address of b.m_a = %0x\n",(long)&b.m_a); // 2dfb44
printf("address of b.m_b = %0x\n",(long)&b.m_b); // 2dfb48
printf("address of b.m_b1 = %0x\n",(long)&b.m_b1); // 2dfb49

p = (int *)(&b.m_a-4);
pp =(int *) *p;

fpA = (FUNCP)*pp;
fpA(); //virtual funcA

fpB = (FUNCP)*(pp+1);
fpB(); //virtual funcB

scanf("%d\n",&aa);
return 0;
}

从输出结果来看,子类对象的确是按照虚函数表指针,父类变量,子类变量的顺序存储。

而且父类变量不跟子类变量一起参与内存对齐。


从类对象起始地址向后移动虚函数指针所占内存大小之后,即可以访问到类对象的数据,

无论此数据的属性是公有还是私有或者保护型。这从一定意义上破坏了类的封装性,但是虽然能够访问到数据,

却不知道数据的类型。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值