Sizeof * этот объект

код:

#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

Почему мои ожидания не оправдались?

Ответ 1

sizeof разрешается во время компиляции, а не во время выполнения. Итак, sizeof(*this) эквивалентно sizeof(myc).

Ответ 2

Я не знаю, почему ваши ожидания ошибочны, потому что я не могу читать мысли:). Но если вы написали sizeof (myc), sizeof (d_myc) компилятор будет генерировать точно такой же код, как и то, что вы закодировали выше. myc имеет 1 int, предполагая 32 бит, поэтому 4 байта. d_myc имеет 2 ints = > 8 байт.

Ответ 3

Это разрешено во время компиляции:

class myc {
    int dummy;
public:
    int si(){return sizeof(*this);}
};

то есть. *this всегда myc и никогда не будет d_myc. Чтобы получить то, что вы хотите, вам придется переопределить функцию в d_myc, чтобы сделать то же самое в производной базе. Это связано с тем, что sizeof(d_myc) также включает базовый класс.