如何针对派生类变量正确使用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
相关产品推荐
相关产品推荐

