クラスの一番目のメンバに親クラスの変数を持たせれば継承はできるが、キャストがめんどくさい。
そこで継承とメソッドのオーバーライドをキャストなしでする方法を考えた。

クラスを一つ定義する毎にマクロを3つ定義する。
・クラスや仮想関数の型定義をするマクロ。
・メンバを定義するマクロ。
・メンバを初期化するマクロ。

■Hoge.h
#define HOGE_DEFINE_CLASS(CLASS)  \
    typedef struct CLASS##_t CLASS;\
    typedef void (*CLASS##_destroy_t)(CLASS *self);\
    typedef void (*CLASS##_print_t)(CLASS *self);\

#define HOGE_DEFINE_MEMBER(CLASS) \
    int hoge;\
    CLASS##_destroy_t destroy;\
    CLASS##_print_t print;\

#define HOGE_INIT_METHOD(CLASS, HOGE) \
    self->hoge = HOGE;\
    self->destroy = (CLASS##_destroy_t) Hoge_destroy;\
    self->print = (CLASS##_print_t) Hoge_print;\

/* クラス定義 */
HOGE_DEFINE_CLASS(Hoge)
struct Hoge_t {
    HOGE_DEFINE_MEMBER(Hoge)
};
Hoge *Hoge_create(int hoge);
void Hoge_destroy(Hoge *self);
void Hoge_print(Hoge *self);