tags:

views:

80

answers:

2

Hi everyone,

One way to hack limited form of polymorphism in C is to do something like this:

typedef struct {
    int x;
} base;

typedef struct {
    base super;
    int y;
} derived;

Now you can refer to a derived instance as a base instance, depending on how the variable is cast, ie:

derived my_derived;
my_derived.y = 10;
my_derived.super.x = 20;
//will print 10
printf("%d", (&my_derived)->y);
//will print 20
printf("%d", ((base*)(&my_derived) )->x);

So my question is, how exactly does this work? Is it because when you cast it as base and referencing a variable, you're referencing the int member 'x' as the offset from the start of the 'base' struct? This is the only thing I can think of, any help would be appreciated.

Thanks alot!

+8  A: 

In a struct, there can be unnamed padding bytes between data elements or at the end of the struct, but not at the beginning. So, the address of the first data element of a struct-type object is guaranteed to be the same as the address of the struct-type object itself.

So, in your example, the address of my_derived is the same as the address of my_derived.super.

James McNellis
+1 This is actually guaranteed by the C spec.
bta
A: 

Is it because when you cast it as base and referencing a variable, you're referencing the int member 'x' as the offset from the start of the 'base' struct?

Yes. This technique is sometimes referred to as "type punning".

This is used in the POSIX standard library; for example, in struct sockaddr. Usually you declare one as a sockaddr_storage, pass it around as a sockaddr, and manipulate it as a sockaddr_in or _in6 depending on what kind of address is actually stored inside it.

Thom Smith