Domanda

Il linguaggio C ++ fornisce funzioni virtual. Entro i vincoli di un'implementazione del linguaggio C puro, come può un effetto simile essere raggiunto?

È stato utile?

Soluzione

qui .

Dalla classe C ++

class A {
protected:
    int a;
public:
    A() {a = 10;}
    virtual void update() {a++;}
    int access() {update(); return a;}
};

un frammento di codice C può essere derivata. Le tre C ++ funzioni membro class A vengono riscritti usando fuori linea codice (standalone) e raccolte per indirizzo in una struttura denominata A_functable. I membri di dati di A e combinata con la tabella di funzione in una struct C di nome A.

struct A;

typedef struct {
    void (*A)(struct A*);
    void (*update)(struct A*);
    int (*access)(struct A*);
} A_functable;

typedef struct A{
    int a;
    A_functable *vmt;
} A;

void A_A(A *this);
void A_update(A* this);
int A_access(A* this);

A_functable A_vmt = {A_A, A_update, A_access};

void A_A(A *this) {this->vmt = &A_vmt; this->a = 10;}
void A_update(A* this) {this->a++;}
int A_access(A* this) {this->vmt->update(this); return this->a;}

/*
class B: public A {
public:
    void update() {a--;}
};
*/

struct B;

typedef struct {
    void (*B)(struct B*);
    void (*update)(struct B*);
    int (*access)(struct A*);
} B_functable;

typedef struct B {
    A inherited;
} B;

void B_B(B *this);
void B_update(B* this);

B_functable B_vmt = {B_B, B_update, A_access};

void B_B(B *this) {A_A(this); this->inherited.vmt = &B_vmt; }
void B_update(B* this) {this->inherited.a--;}
int B_access(B* this) {this->inherited.vmt->update(this); return this->inherited.a;}

int main() {
    A x;
    B y;
    A_A(&x);
    B_B(&y);
    printf("%d\n", x.vmt->access(&x));
    printf("%d\n", y.inherited.vmt->access(&y));
}

più elaborati del necessario, ma ottiene il punto attraverso.

Altri suggerimenti

@GCC .... Una funzione virtuale è dichiarata nella classe base di un oggetto ed è quindi "sovresposta" o attuate nelle classi secondarie. vale a dire, dire che avete classe Veicolo di base e si creano due sottoclassi, Moto e, Automobile. Classe Base dichiara una funzione virtuale di AddTires () Quindi le sottoclassi avrebbero implementare questa funzione e ciascuna classe sub avrebbero implementare in modo diverso. Una macchina ha 4 ruote, dove una motocicletta ha 2. Non posso dare la sintassi di C o C ++, però. Spero che questo aiuti

Le funzioni virtuali sono una caratteristica di orientamento agli oggetti C ++ 's. Essi si riferiscono a metodi che dipendono da una specifica istanza di oggetto piuttosto che che tipo che stai attualmente li trasportano in giro come.

In altre parole: se si crea un'istanza di un oggetto come bar, poi gettarlo ai Foo, metodi virtuali saranno ancora quelli che erano a istanziazione (definito in bar), mentre altri metodi saranno quelli di Foo

Le funzioni virtuali sono tipicamente implementate attraverso VTables (che è per voi di fare ulteriori ricerche su;).)

È possibile simulare cose simili in C utilizzando le strutture come oggetti del povero uomo e risparmio puntatori a funzione in loro.

(Più correttamente, funzioni non virtuali rendono ambiguo quale classe il metodo dovrebbe essere preso da, ma in pratica ritengo C ++ utilizza il tipo di corrente.)

Qui è una descrizione di ciò che funzioni virtuali sono.

Non v'è alcun modo per implementare funzioni virtuali in pianura C, in quanto C non ha alcuna nozione di eredità.

Aggiornamento: Come è discusso nei commenti qui sotto, è possibile fare qualcosa di simile a funzioni virtuali in C diritta utilizzando strutture e puntatori a funzione. Tuttavia, se siete abituati ad un linguaggio come C ++ che ha "veri" funzioni virtuali, probabilmente troverete il C approssimazione molto meno elegante e più difficile da usare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top