Frage

Die Sprache C ++ bietet virtual Funktionen. Innerhalb der Grenzen einer reinen Umsetzung der C-Sprache, wie kann ein ähnlicher Effekt erzielt werden?

War es hilfreich?

Lösung

Stolen von hier .

Von der C ++ Klasse

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

ein C-Code-Fragment abgeleitet werden. Die drei C ++ Elementfunktionen class A neu geschrieben werden unter Verwendung von out-of-line (Standalone) -Code und Adresse in eine struct namens A_functable gesammelt. Die Datenelemente von A und mit der Funktionstabelle in eine C-Struktur namens A kombiniert.

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));
}

aufwendiger als notwendig, aber es erhält den Punkt herüber.

Andere Tipps

@GCC .... Eine virtuelle Funktion in der Basisklasse eines Objekts erklärt und ist dann „überschriebenen“ oder in den Unterklassen implementiert. das heißt, Sie sagen Fahrzeugbasisklasse haben und erstellen Sie zwei Unterklassen, Motorrad und Automobil. Die Basisklasse eine virtuelle Funktion von AddTires erklären würde () Dann wird die Unterklassen würden diese Funktion implementieren und jede Unterklasse wäre es anders implementieren. Ein Auto hat vier Räder, wo ein Motorrad 2 hat, kann ich Ihnen die Syntax für C oder C ++ nicht geben, though. Hoffe, das hilft

Virtuelle Funktionen sind eine Funktion von C ++ 's Objektorientierung. Sie beziehen sich auf Methoden, die eher auf einem bestimmten Objektinstanz abhängig als das, was geben Sie gerade tragen sie herum wie.

Mit anderen Worten: Wenn Sie ein Objekt als Bar instanziiert, warf sie dann auf Foo, werden virtuelle Methoden noch diejenigen sein, sie bei der Instanziierung waren (definiert in Bar), während andere Methoden die, die von Foo sein wird.

sind virtuelle Funktionen typischerweise implementiert durch vtables (das ist für Sie mehr Forschung tun auf;)).

Sie können ähnliche Dinge in C simulieren, indem structs als Arme-Leute-Objekte und Speichern von Funktionszeiger in ihnen.

(Mehr richtig, nicht-virtuelle Funktionen machen es nicht eindeutig, welche Klasse sollte das Verfahren aus genommen werden, aber in der Praxis Ich glaube, C ++ verwendet den aktuellen Typen).

Hier ist eine Beschreibung dessen, was virtuelle Funktionen sind.

Es gibt keine Möglichkeit, virtuelle Funktionen einfach in C zu implementieren, da C keine Ahnung von Vererbung hat.

Update: mit Strukturen und Funktionszeigern wie in den Kommentaren unten diskutiert wird, ist es möglich, etwas ähnliches wie virtuelle Funktionen in C gerade zu tun. Wenn Sie jedoch zu einer Sprache wie C ++ gewohnt sind, die „echte“ virtuelle Funktionen hat, werden Sie wahrscheinlich die C Annäherung weit weniger elegant finden und schwieriger zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top