C++对象 内存细节(一)

本文探讨了C++中类对象在内存中的布局,尤其是继承关系下的内存表现。通过实例展示了基类指针对派生类对象的访问限制,以及sizeof()运算符在不同对象上的结果,揭示了对象内存的组织方式。
摘要由CSDN通过智能技术生成
        首先考虑成员变量在类的继承中的行为 代码41-55行,基类指针可以准确的判断出哪些变量是基类可见的,哪些是“理论上”不可见的。这样的行为是C++类的内存结构所实现的。通过sizeof()我们可以发现这三个类的对象的大小分别为8、12、16。所以这三个类在内存中的摆放应该是这的:

                       

        而箭头所指的内存地址就是对象所在的位置。根据你给定的指针的类型的不同,你就只能看到受到限制的这一部分内容了。这里的 三种指针的访问范围就对应了那三个框的范围。
        由此可以简单的“越狱”访问你理论上不能访问的东西,这里就不再解释了。

        关于函数的部分下次再说吧 = =


#include <iostream>
#include <cstdio>
using namespace std;

//为了方便测试,所有的成员变量都先设定为public

class Parent
{
public:
    int zero;
public:
    Parent() { this->zero = 0; }
    virtual void fun() { cout << "Parent::fun" << endl; }
};

class ChildOne : public Parent
{
public:
    int one;
public:
    ChildOne() { Parent::Parent(); this->one = 1; }
    virtual void fun(){ cout << "ChildOne::fun" << endl; }
};

class ChildTwo : public ChildOne
{
public:
    int two;
public:
    ChildTwo() { Parent::Parent(); this->two = 2; }
    virtual void fun(){ cout << "ChildTwo::fun" << endl; }
};

int main()
{
    Parent *p;
    ChildOne *o;
    ChildTwo *t;

//成员变量
    p = new Parent();
    cout << p->zero << endl;
    o = new ChildOne();
    cout << o->zero << endl;
    cout << o->one << endl;

    delete p;
    p = new ChildOne();
    cout << p->zero << endl;
//  cout << p->one << endl; 无法访问
    delete p;
    p = (Parent*)new ChildTwo();
    cout << p->zero << endl;
//  cout << p->one << endl; 无法访问
//  cout << p->two << endl; 无法访问

//  cout << sizeof(*p) << endl;
//  cout << sizeof(*o) << endl;
//  cout << sizeof(*t) << endl;




//成员函数
    p = new Parent();
    p->fun();

    delete p;
    p = (Parent*)new ChildOne();
    p->fun();

    delete p;
    p = (Parent*)new ChildTwo();
    p->fun();

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值