提问:关于获取对象指针所指对象的大小问题

杜晓萌 2013-10-15 11:18:47
大家好,问题是这样的,基类对象指针与派生类对象指针均由派生类对象进行实例化,在用sizeof运算符计算两个指针解引用情况下的大小时,得到了不同的结果,为何二者指向相同的派生类对象,解引用后计算的大小会不相同呢,谢谢(大小分别是16、20字节)。
ClassA a;//基类对象
ClassB b;//派生类对象
ClassA *pClassA = &b;
ClassB *pClassB = &b;
cout << sizeof(*pClassA) << endl;
cout << sizeof(*pClassB) << endl;
cout << &(*pClassA) << endl;
cout << &(*pClassB) << endl;


...全文
340 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
杜晓萌 2013-10-16
  • 打赏
  • 举报
回复
sizeof表达式的结果是编译时常量,因此只能计算静态类型的长度。对对象指针解引用后的sizeof操作返回的是对象指针的静态类型长度,因此才出现了自己问题中的计算结果。谢谢各位的回答。
lm_whales 2013-10-15
  • 打赏
  • 举报
回复
引用 3 楼 supermegaboy 的回复:
可以利用一下多态获得动态类型的大小。

class A
{
public :

    virtual size_t getSize( )
    {
        return sizeof( *this );
    }

private :

    int a = 10;
};

class B : public A
{
public :

    virtual size_t getSize( ) override
    {
        return sizeof( *this );
    }

private :

    int b = 20;
};

class C : public B
{
public :

    virtual size_t getSize( ) override
    {
        return sizeof( *this );
    }

private :

    int c = 30;
};
++ 这种方法很好啊!
  • 打赏
  • 举报
回复
sizeof只是计算的是静态类型的大小。在编译时,直接用常数给替换了. 比如 ClassA *pClassA = &b; cout << sizeof(*pClassA) << endl; 编译完后 sizeof(*pClassA)直接替换为16
mujiok2003 2013-10-15
  • 打赏
  • 举报
回复
引用 1 楼 ri_aje 的回复:
sizeof 计算的是静态类型的大小。
++
飞天御剑流 2013-10-15
  • 打赏
  • 举报
回复
可以利用一下多态获得动态类型的大小。

class A
{
public :

    virtual size_t getSize( )
    {
        return sizeof( *this );
    }

private :

    int a = 10;
};

class B : public A
{
public :

    virtual size_t getSize( ) override
    {
        return sizeof( *this );
    }

private :

    int b = 20;
};

class C : public B
{
public :

    virtual size_t getSize( ) override
    {
        return sizeof( *this );
    }

private :

    int c = 30;
};
ztenv 版主 2013-10-15
  • 打赏
  • 举报
回复
引用 楼主 Haohan_Meng 的回复:
大家好,问题是这样的,基类对象指针与派生类对象指针均由派生类对象进行实例化,在用sizeof运算符计算两个指针解引用情况下的大小时,得到了不同的结果,为何二者指向相同的派生类对象,解引用后计算的大小会不相同呢,谢谢(大小分别是16、20字节)。 ClassA a;//基类对象 ClassB b;//派生类对象 ClassA *pClassA = &b; ClassB *pClassB = &b; cout << sizeof(*pClassA) << endl; cout << sizeof(*pClassB) << endl; cout << &(*pClassA) << endl; cout << &(*pClassB) << endl;
这样是计算不出来的,对为解指针后,得到的是指针的具体类型并不一定是指针指向的类型
ri_aje 2013-10-15
  • 打赏
  • 举报
回复
sizeof 计算的是静态类型的大小。

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧