Если вы действительно хотите эмулировать полиморфизм, вы можете, это просто уродливо.
typedef struct Card_t Card;
typedef struct
{
void (*print)(Card*);
int (*do_action)(Card*, struct GameState*, int);
/* other possibly card-specific functions here */
} CardMethods;
struct Card_t
{
int value;
int cost;
CardMethods* vtab;
};
int stdAct(Card* this, GameState* st, int choice)
{
this->vtab->print(this); //do this card's specific print function.
/* do common actions based on state&choice */
}
int specialPrint1(Card* this)
{
stdPrint(this); //call parent print function
printf("something special here"); //add behavior
}
CardMethods standardCard={stdPrint, stdAct};
CardMethods specialCard1={specialPrint1, stdAct};
CardMethods specialCard2={stdPrint, specialAct1};
CardMethods specialCard3={specialPrint2, specialAct2};
static struct cardDefinitions[] = {
{0, 1, &standardCard},
{1, 3, &standardCard},
{2, 3, &specialCard1},
{2, 4, &specialCard2},
/*...*/
};
cardDefinitions[i].vtab->do_action(&cardDefinitions[i], state, choice)
На данный момент вы делаете большую часть того, что компилятор C ++ делает за кулисами.Вы также можете просто использовать C ++.