Язык С++ предоставляет функции virtual
. В рамках ограничений чистой реализации языка C, как можно добиться аналогичного эффекта?
Как реализовать виртуальные функции С++ в C
Ответ 1
Украден из здесь.
Из класса С++
class A {
protected:
int a;
public:
A() {a = 10;}
virtual void update() {a++;}
int access() {update(); return a;}
};
может быть получен фрагмент кода C. Три функции члена С++ из class A
переписываются с использованием автономного (автономного) кода и собираются по адресу в структуру с именем A_functable
. Элементы данных A
и объединены с таблицей функций в C-структуру с именем 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));
}
Более сложный, чем необходимо, но он имеет смысл.
Ответ 2
@GCC.... Виртуальная функция объявляется в базовом классе объекта и затем "переопределяется" или реализуется в подклассах. например, у вас есть класс Vehicle Base, и вы создаете два подкласса, мотоцикл и автомобильный. Базовый класс объявит виртуальную функцию AddTires(). Затем Sub Classes будут реализовывать эту функцию, и каждый подкласс будет реализовывать ее по-разному. Автомобиль имеет 4 колеса, где мотоцикл имеет 2. Я не могу дать вам синтаксис для C или С++. Надеюсь, что это поможет
Ответ 3
Виртуальные функции - это функция ориентации объектов С++. Они ссылаются на методы, которые зависят от конкретного экземпляра объекта, а не от того типа, который вы в настоящее время используете для него.
Другими словами: если вы создаете экземпляр объекта как Bar, а затем передаете его в Foo, виртуальные методы все равно будут теми, которые были в экземпляре (определенными в Bar), в то время как другие методы будут такими же из Foo.
Виртуальные функции, как правило, реализуются посредством vtables (что вам нужно сделать больше исследований;)).
Вы можете моделировать подобные вещи в C, используя структуры как объекты бедного человека и сохраняя в них указатели функций.
(Вернее, не виртуальные функции делают его двусмысленным, из какого класса следует использовать метод, но на практике я считаю, что С++ использует текущий тип.)
Ответ 4
Здесь приведено описание того, какие виртуальные функции есть.
Невозможно реализовать виртуальные функции в простом C, потому что C не имеет понятия наследования.
Update: Как обсуждается в комментариях ниже, можно сделать что-то похожее на виртуальные функции в прямых C, используя структуры и указатели функций. Однако, если вы привыкли к языку С++, который имеет "истинные" виртуальные функции, вы, вероятно, найдете приближение C гораздо менее изящным и более сложным в использовании.