基类和派生类的地址和布局

#include <iostream>

using namepsace std;


class A
{

    int m_nA;
};

class B
{
    int m_nB; 
};

class C:public A,public B
{
    int m_nC;
};

int main()

{

    C * pC = new C;

    B * pB = dynamic_cast<B*>(pC);

    A * pA = dynamic_cast<A*>(pC);

    if(pC == pB)

    {

        cout << "equal"  << endl;

    }

    else

    {

        cout << "not equal" << endl;

    }

    if(int(pC) == int(pB))

    {

        cout << "equal" << endl;

    }

    else

    {

        cout << "not equal" << endl;

    }

    return 0;

}

这是《程序员面试宝典》里的一道题,问你输出什么

分析:从int main下面开始逐句分析,首先定义一个对象指针pC指向一个按类C结构初始化后的空间。同时定义父类指针pB和pC并使他们获得在pC指向的空间自己的首地址,此时假设pC指向的对象地址为0x3d3dd8,由于B是C的父类,因此pB并不知道pC所有的成员,所以pB指向的那段空间应该是C从B继承的那个成员首地址开始,0x3d3ddC。但是pB == pC在比较时发生隐式转换,少空间向多空间扩展,即(C *)pB == pC,两者相等,输出equal,同理。由于第二个强化类型转换,所以是not equal

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_26654257

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值