Because all pointers are the same size in C, and a pointer to a struct always points to the first member of the struct, you can do inheritance by having the "superstruct" be the first member of the substruct:
struct foo {
...
};
struct bar {
struct foo super;
...
};
You can now safely pass a pointer to bar into a function that takes pointer to foo.