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

来源:互联网 发布:数据部门团建出行标语 编辑:程序博客网 时间:2024/06/06 19:35

#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

原创粉丝点击