C言語の構造体(共用体)キャストの勉強

C言語でデータを抽象化する場合には、どうすれば良いか困ったので、
試してみました。※ レベルとしては、初級〜中級くらいだと思いますが 。。。

試したのは以下のキャスト

  • サブクラスに相当する構造体(Sub) =>スーパークラスに相当する構造体(Super)
  • 共用体メンバ(Sub) => 共用体(UnionData)
// test.c
#include <stdio.h>

// スーパークラス
typedef struct {
    int a;
} Super;

// サブクラス
typedef struct {
    Super super;
    int b;
} Sub;

// 共用体
typedef union {
    Super super;
    Sub   sub;
} UnionData;

// メイン関数
int main(void)
{
    Super* super;       // スーパークラス
    Sub    sub;             // サブクラス
    UnionData* data; // 共用体

    // 初期化
    sub.super.a = 1;
    sub.b = 2;

    // サブクラス => スーパークラス へのキャスト
    super = (Super*) &sub;
    printf("super.a = %d\n", super->a);

    // 共用体メンバ => 共用体へのキャスト
    data = (UnionData*) &sub;
    printf("union.sub.b = %d\n", data->sub.b); 

    return 0;
}

以下の通り実行しました。
Warningも出ることなく、うまくいったようです。
はじめは、構造体(共用体)の実体をキャストしようとしてうまくいかなかったのですが、
実体ではなく、ポインタでやるといいようです。 (仕組みは良くわかっていませんが。。。)

shell$ gcc test.c -Wall
shell$ ./a.out
super.a = 1
union.sub.b = 2