teorico - ¿Cómo se podría implementar funciones virtuales de C++ en C[duplicado]?
polimorfismo en programacion (4)
El lenguaje C ++ proporciona funciones virtual
. Dentro de las limitaciones de una implementación de lenguaje C puro, ¿cómo se puede lograr un efecto similar?
@GCC .... Una función virtual se declara en la clase Base de un objeto y luego se "invalida" o se implementa en las subclases. es decir, digamos que tiene clase Base de vehículo y crea dos subclases, Motocicleta y Automóvil. La clase base declararía una función virtual de AddTires () Luego, las subclases implementarán esta función y cada subclase lo implementará de manera diferente. Un automóvil tiene 4 ruedas, donde una motocicleta tiene 2. Sin embargo, no puedo darte la sintaxis de C o C ++. Espero que esto ayude
Las funciones virtuales son una característica de la orientación a objetos de C ++. Se refieren a métodos que dependen de una instancia de objeto específica en lugar de a qué tipo de tipo los está utilizando actualmente.
En otras palabras: si crea una instancia de un objeto como Bar, luego lo convierte en Foo, los métodos virtuales seguirán siendo los que se encontraban en la instanciación (definidos en Bar), mientras que otros métodos serán los de Foo.
Las funciones virtuales se implementan normalmente por medio de vtables (para que usted pueda investigar más;)).
Puedes simular cosas similares en C usando estructuras como objetos de hombres pobres y guardando punteros de función en ellos.
(Más correctamente, las funciones no virtuales hacen que sea ambiguo de qué clase debe tomarse el método, pero en la práctica creo que C ++ usa el tipo actual).
Robado de here .
De la clase C ++
class A {
protected:
int a;
public:
A() {a = 10;}
virtual void update() {a++;}
int access() {update(); return a;}
};
Se puede derivar un fragmento de código C Las tres funciones miembro de C ++ de la class A
se reescriben usando un código fuera de línea (independiente) y se recopilan por dirección en una estructura llamada A_functable
. Los miembros de datos de A
y combinados con la tabla de funciones en una estructura de C denominada 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));
}
Más elaborado de lo necesario, pero se entiende.
Here hay una descripción de lo que son las funciones virtuales.
No hay forma de implementar funciones virtuales en C simple, porque C no tiene noción de herencia.
Actualización: Como se explica en los comentarios a continuación, es posible hacer algo similar a las funciones virtuales en C directa utilizando estructuras y punteros de función. Sin embargo, si está acostumbrado a un lenguaje como C ++ que tiene funciones virtuales "verdaderas", es probable que encuentre la aproximación en C mucho menos elegante y más difícil de usar.