首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-10-17 
提问:关于获取对象指针所指对象的大小问题大家好,问题是这样的,基类对象指针与派生类对象指针均由派生类对

提问:关于获取对象指针所指对象的大小问题
   大家好,问题是这样的,基类对象指针与派生类对象指针均由派生类对象进行实例化,在用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;
 
   

[解决办法]
sizeof 计算的是静态类型的大小。
[解决办法]

引用:
   大家好,问题是这样的,基类对象指针与派生类对象指针均由派生类对象进行实例化,在用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;
 
   


这样是计算不出来的,对为解指针后,得到的是指针的具体类型并不一定是指针指向的类型
[解决办法]
可以利用一下多态获得动态类型的大小。


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 计算的是静态类型的大小。

++
[解决办法]
sizeof只是计算的是静态类型的大小。在编译时,直接用常数给替换了.
比如
 ClassA *pClassA = &b;
 cout << sizeof(*pClassA) << endl;  编译完后 sizeof(*pClassA)直接替换为16
[解决办法]
引用:
可以利用一下多态获得动态类型的大小。


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;
};


++ 
这种方法很好啊!

热点排行