Pregunta

El lenguaje C ++ proporciona funciones virtual. Dentro de las limitaciones de una aplicación en lenguaje C pura, ¿cómo se puede lograr un efecto similar?

¿Fue útil?

Solución

aquí .

A partir de la clase de C ++

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

un fragmento de código C se puede derivar. Las tres funciones miembro C ++ de class A se vuelven a escribir usando fuera de la línea de código (autónomo) y se recogieron por dirección en un A_functable struct nombrado. Los miembros de datos de A y combinado con la tabla de funciones en un C struct A nombrado.

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

más elaborada de lo necesario, pero se pone el punto a través.

Otros consejos

@GCC .... Una función virtual se declara en la clase base de un objeto y es entonces "overriden" o implementado en las clases sub. es decir, supongamos que tiene Clase base del vehículo y se crean dos sub-clases, motocicletas y, Automóvil. La clase base sería declarar una función virtual de AddTires () A continuación, las subclases implementarían esta función y cada subclase implementarían de manera diferente. Un coche tiene 4 ruedas, donde una motocicleta tiene 2. No puedo dar la sintaxis de C o C ++, sin embargo. Esperamos que esto ayude

funciones virtuales son una característica de orientación a objetos C ++ 's. Se refieren a los métodos que dependen de una instancia de objeto específico en lugar de lo que escribe la que se está llevando a su alrededor como.

En otras palabras: si una instancia de un objeto como bar, luego echarlo a Foo, métodos virtuales seguirán siendo los que estaban en la instanciación (definido en el bar), mientras que otros métodos serán los de Foo

funciones virtuales se implementan típicamente por medio de vtables (que es para que usted pueda hacer más investigación sobre;).)

Se puede simular cosas similares en C mediante el uso de estructuras como objetos de pobre y el ahorro de los punteros de función en ellos.

(más correctamente, las funciones no virtuales hacen que sea ambiguo, que el método de la clase debe ser tomado de, pero en la práctica creo que C ++ utiliza el tipo actual.)

Aquí es una descripción de lo que son las funciones virtuales.

No hay manera de implementar las funciones virtuales en C plano, debido a que C no tiene noción de herencia.

Actualización: Como se discute en los comentarios a continuación, es posible hacer algo similar a las funciones virtuales en C recta utilizando las estructuras y los punteros de función. Sin embargo, si usted está acostumbrado a un lenguaje como C ++ que tiene "verdaderos" funciones virtuales, es probable que encuentre la aproximación C mucho menos elegante y más difícil de usar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top