【问题标题】:Object size of base class while referring to derived class引用派生类时基类的对象大小
【发布时间】:2020-11-10 11:40:53
【问题描述】:
#include<bits/stdc++.h>

using namespace std;

class abc {
  public:
    int a = 45;
  void sum() {
    int s = 55;
    cout << s + a << endl;
  }
};
class xyz: public abc {
  public: int b = 45;
  int c = 54;
  int d = 96;
  int x = 8;
  void show() {
    cout << "xyz class" << endl;
  }
};
int main() {
  abc * ob;
  xyz d;
  ob = & d;
  cout << sizeof( * ob) << endl;
}

为什么sizeof 函数在这种情况下返回 4? 从我的立场来看,指针ob 指向一个已经创建的对象d 的派生类xyz,其大小为20。所以sizeof(*ob) 也应该返回这个值:20。

【问题讨论】:

    标签: c++ c++11 c++14 size sizeof


    【解决方案1】:

    sizeof 运算符处理静态类型,而不是动态类型。 *ob 是静态类型 abc,所以这就是它返回的大小。

    请注意,sizeof 是在编译时执行的,编译器无法确定作为继承层次结构一部分的实例的动态类型。在你的 sn-p 中,看起来这种查找可以很容易地执行,但是想象一下

    abc *ob;
    
    sizeof(*ob);
    

    其他翻译单元中的任何地方,其中xyz 甚至不为人所知。

    【讨论】:

    • 你的意思是abc* ob; 吗?
    • 如果标准要求,可能已经实现了动态sizeof。例如。我们可以将其存储在std::type_info
    • @HolyBlackCat 你能解释一下如何实现吗?
    • @user55092 我想象的实现需要修改编译器。你不能从程序本身做到这一点。
    【解决方案2】:

    这是here写的:

    当应用于表达式时,sizeof 不会计算表达式,即使表达式指定了多态对象,结果也是表达式的静态类型的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多