Potresti emulare in C i metodi virtuali C++ inventandoti una specie di vtable da inserire nelle strutture, ossia dei puntatori a funzione contenuti in ogni struttura (inizializzati quando la struttura viene creata) che le funzioni generiche vanno a richiamare quando sono chiamate; in alternativa puoi risolvere la questione con delle macro, tipo
codice:
#define funzione(struttura, parametro1, parametro2) if(struttura.membroCheLaIdentifica==valoreMagico) funzione_1(struttura,parametro1,parametro2) else funzione(struttura, parametro1, parametro2)
.
La cosa più saggia a mio avviso resta comunque passare al C++ dove questi problemi sono facilmente risolti con i metodi virtuali
codice:
class ClasseBase
{
/* bla bla bla */
public:
virtual void metodo1() = 0;
}
class Derivata1 : public ClasseBase
{
/* bla bla bla */
public:
virtual void metodo1();
}
class Derivata2 : public ClasseBase
{
/* bla bla bla */
public:
virtual void metodo1();
}
Derivata1::metodo1()
{
/* implementazione specifica per Derivata1 */
}
Derivata2::metodo1()
{
/* implementazione specifica per Derivata2 */
}
/* Una funzione che ha un generico puntatore a ClasseBase
e richiama metodo1 richiamerà automaticamente la versione corretta */
void funzioneInutile(ClasseBase * cb)
{
cb->metodo1();
}
.