Il progetto è difficile, questo è da fissarlo in testa.

Eccoti un esempio per le strutture derivate.

codice:
struct V1
{
      int cSize;
      int campo1;
};


struct V2
{
      int cSize;
      int campo1;
      int campo2;
};

Le 2 strutture evidentemente differiscono per la loro grandezza.
Dunque puoi usarle entrambe in un'unica funzione che prende un puntatore alla struttura base e fare poi considerazioni sulla grandezza. Esempio pratico

codice:
V2 v;
v.campo1 = 2;
v.campo2 = 3;
v.cSize = sizeof(V2);

Funzione((V1*)&V2);


void Funzione(V1 *p)
{
        if (p->cSize == sizeof(V1))
        {//codice per V1}

        if (p->cSize == sizeof(V2))
        {V2 *pp = (V2*)&p; //altro codice}
         
}