You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何针对派生类变量正确使用sizeof获取其实际内存大小?

问题原因

基类的getsizeof()不是虚函数,C++编译器会做静态绑定:当你通过派生类对象调用这个成员函数时,实际执行的是基类版本的函数。此时函数内的*this类型是one_t&,所以sizeof(*this)计算的是基类one_t的大小,而非派生类two_t的——这就是输出始终为8的核心原因。

另外还要修正两个代码细节:

  • 基类的getsizeof()是私有成员,外部无法直接调用,需要改为public权限;
  • C++标准中main函数的返回类型必须是int,而非void。
解决方案

这里提供几种可行的解决方式:

方式一:将基类函数声明为虚函数

利用C++的动态绑定特性,让调用的函数版本匹配对象的实际类型:

#include <iostream>
using namespace std;

class one_t {
public:
    virtual size_t getsizeof() { return sizeof(*this); }     
    // ... 其他成员 ... 
};

class two_t : public one_t {
    // ... 补充成员 ...
};
    
int main()
{
    two_t _2;
    cout << _2.getsizeof(); 
    return 0;
}

方式二:直接在外部使用sizeof运算符

如果不需要通过成员函数获取大小,这是最简单直接的方式:

#include <iostream>
using namespace std;

class one_t {
    // ... 其他成员 ... 
};

class two_t : public one_t {
    // ... 补充成员 ...
};
    
int main()
{
    two_t _2;
    cout << sizeof(_2); 
    return 0;
}

方式三:使用模板成员函数

通过模板推导对象的实际类型,避免依赖虚函数:

#include <iostream>
using namespace std;

class one_t {
public:
    template<typename T>
    size_t getsizeof(const T& obj) { return sizeof(obj); }     
    // ... 其他成员 ... 
};

class two_t : public one_t {
    // ... 补充成员 ...
};
    
int main()
{
    two_t _2;
    cout << _2.getsizeof(_2); 
    return 0;
}

内容的提问来源于stack exchange,提问作者blueperfect

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:30:51