15

Code:

#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;
}

output :

4 4
4 8

I expected :

4 8
4 8

Why were my expectations wrong?

all
  • 314
  • 5
  • 16

2 Answers2

26

sizeof is resolved at compile-time, not run-time. So sizeof(*this) is equivalent to sizeof(myc).

Oliver Charlesworth
  • 267,707
  • 33
  • 569
  • 680
1

This is resolved at compile time:

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

i.e. *this is always myc and will never be d_myc. To get what you want you will have to override the function in d_myc to do the same in the derived as the base. This is because sizeof(d_myc) includes the base class too.

fwg
  • 1,018
  • 2
  • 10
  • 25