Это будет работать, но вы должны иметь в виду, что компилятор не будет ничего предупреждать / говорить вам о проблемах, связанных с доступом к переменным или чем-то подобным. Этот метод небезопасен, потому что иногда это явное приведение может быть злым. Возьмите этот пример в качестве примера:
typedef struct _A
{
double x, y;
} A;
typedef struct _B
{
A super;
double z;
} B;
typedef struct _C
{
A super; // we wanted B, but wrote A by mistake
double w;
} C;
C* c;
B* b = (B*)c;
// will write to C::w instead of B::z and no one will warn you about this.
// you'll need to track this by hand after your application crashes.
b->z = 1234;
Этот тип вещей может легко посадить самолет на землю. :)
Что касается производительности, то в конечном итоге будет сделано то же самое, как если бы вы взяли указатель на super вручную (более безопасно, чем приведение):
A* a;
B* b = &a->b;
Также я не думаю, что это популярно в наши дни (по крайней мере, не для таких молодых программистов, как я, которые стали программировать на более современных компиляторах)
Кроме того, компилятор C ++ является опцией? В наши дни более современные компиляторы, которые допускают наследование структуры - лучше, чем приведение таким образом.