#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 не вычисляет выражение, и даже если выражение обозначает полиморфный объект, результатом является размер статического типа выражения.