Размер объекта базового класса при ссылке на производный класс

#c #c 11 #c 14 #size #sizeof

#c #c 11 #c 14 #размер #sizeof

Вопрос:

 #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 = amp; d;
  cout << sizeof( * ob) << endl;
}
  

Почему sizeof функция возвращает 4 в этом случае?
С того места, где я стою, указатель ob указывает на уже созданный объект d производного класса xyz , размер которого равен 20. So sizeof(*ob) также должен возвращать это значение: 20.

Ответ №1:

sizeof Оператор имеет дело со статическими типами, а не с динамическими. *ob имеет статический тип abc , так что это размер, который он возвращает.

Обратите внимание, что sizeof это выполняется во время компиляции, и компилятор не может определить динамический тип экземпляра, который является частью иерархии наследования. В вашем фрагменте похоже, что такой поиск можно легко выполнить, но представьте

 abc *ob;

sizeof(*ob);
  

где-нибудь в какой-нибудь другой единице перевода, где xyz даже неизвестно.

Комментарии:

1. вы имеете в виду abc* ob; ?

2. sizeof Вероятно, можно было бы реализовать динамический, если бы этого требовал стандарт. Например. мы могли бы сохранить его std::type_info .

3. @HolyBlackCat как это реализовать, вы можете объяснить?

4. @user55092 Реализация, которую я себе представлял, требует модификации компилятора. Вы не можете сделать это из самой программы.

Ответ №2:

Это то, что написано здесь:

При применении к выражению sizeof не вычисляет выражение, и даже если выражение обозначает полиморфный объект, результатом является размер статического типа выражения.