Question

Le langage C ++ fournit des fonctions de virtual. Dans les limites d'une implémentation du langage C pur, comment un effet similaire peut être obtenu?

Était-ce utile?

La solution

.

De la classe C ++

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

un fragment de code C peut être dérivé. Les trois fonctions membres ++ C de class A sont réécrit en utilisant out-of-line code (autonome) et collectés par l'adresse dans une struct nommée A_functable. Les membres de données de A et combinée avec la table de fonctions dans une structure C nommé 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));
}

plus élaborée que nécessaire, mais il obtient le point à travers.

Autres conseils

@GCC .... Une fonction virtuelle est déclarée dans la classe de base d'un objet et est alors « surchargée » ou mis en œuvre dans les sous-classes. dire, que vous avez la classe des véhicules de base et de créer deux sous-classes, de motocyclettes et, Automobile. La classe de base déclarerait une fonction virtuelle de AddTires () Ensuite, les sous classes appliqueraient cette fonction et chaque sous-classe appliqueraient différemment. Une voiture a 4 roues, où une moto a 2. Je ne peux pas vous donner la syntaxe C ou C ++, cependant. Espérons que cela aide

Les fonctions virtuelles sont une caractéristique d'orientation de l 'objet C ++. Ils se réfèrent à des méthodes qui dépendent d'une instance d'objet spécifique plutôt que ce type que vous les porte actuellement autour comme.

En d'autres termes: si vous instancier un objet comme bar, puis le jeter aux Foo, méthodes virtuelles seront toujours ceux qu'ils étaient à l'instanciation (défini dans la barre), alors que d'autres méthodes seront celles de Foo

Les fonctions virtuelles sont généralement mises en œuvre par des vtables (qui est pour vous de faire plus de recherches sur;).)

Vous pouvez simuler des choses similaires en C en utilisant struct comme les objets du pauvre et de sauver des pointeurs de fonction en eux.

(Plus correctement, les fonctions non virtuelles rendent ambiguë quelle classe la méthode doit être prise à partir, mais en pratique, je crois C ++ utilise le type en cours.)

est une description des fonctions virtuelles sont.

Il n'y a aucun moyen de mettre en œuvre des fonctions virtuelles en C plaine, parce que C n'a aucune notion d'héritage.

Mise à jour: Comme nous le verrons dans les commentaires ci-dessous, il est possible de faire quelque chose de similaire à des fonctions virtuelles en C droite en utilisant des structures et des pointeurs de fonction. Toutefois, si vous êtes habitué à un langage comme C ++ qui a « vrai » fonctions virtuelles, vous trouverez probablement l'approximation C beaucoup moins élégante et plus difficile à utiliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top