引用派生 class 时基础 class 的对象大小

Object size of base class while referring to derived class

#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 函数 return 4 在这种情况下? 从我的立场来看,指针 ob 指向派生 class xyz 的已创建对象 d,其大小为 20。因此 sizeof(*ob) 也应该 return这个值:20.

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

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

abc *ob;

sizeof(*ob);

其他一些翻译单元中的任何地方,xyz 甚至不知道。

这是写的here:

When applied to an expression, sizeof does not evaluate the expression, and even if the expression designates a polymorphic object, the result is the size of the static type of the expression.