Ответ 1
sizeof
разрешается во время компиляции, а не во время выполнения. Итак, sizeof(*this)
эквивалентно sizeof(myc)
.
код:
#include <cstdio>
class myc {
int dummy;
public:
int si(){return sizeof(*this);}
};
class d_myc : public myc {
int d_dummy;
};
int main() {
myc a;
d_myc b;
printf("%d %d\n%d %d", a.si(), b.si(), sizeof(a), sizeof(b));
return 0;
}
вывод:
4 4
4 8
Я ожидал:
4 8
4 8
Почему мои ожидания не оправдались?
sizeof
разрешается во время компиляции, а не во время выполнения. Итак, sizeof(*this)
эквивалентно sizeof(myc)
.
Я не знаю, почему ваши ожидания ошибочны, потому что я не могу читать мысли:). Но если вы написали sizeof (myc), sizeof (d_myc) компилятор будет генерировать точно такой же код, как и то, что вы закодировали выше. myc имеет 1 int, предполагая 32 бит, поэтому 4 байта. d_myc имеет 2 ints = > 8 байт.
Это разрешено во время компиляции:
class myc {
int dummy;
public:
int si(){return sizeof(*this);}
};
то есть. *this
всегда myc и никогда не будет d_myc
.
Чтобы получить то, что вы хотите, вам придется переопределить функцию в d_myc
, чтобы сделать то же самое в производной базе. Это связано с тем, что sizeof(d_myc)
также включает базовый класс.