11. juli 2005 - 16:15
Der er
8 kommentarer og 1 løsning
polymorfi i c
Hej, Jeg tænkte på om der var nogen her som måske kan give mig et prej til hvordan jeg kan implementerer polymorfi i c. - Kristian.
Annonceindlæg fra Barco
erklær dine metoder for virtual
example.h --------- class P1 { public: void foobar(); }; class C1 : public P1 { public: void foobar(); }; class P2 { public: virtual void foobar(); }; class C2 : public P2 { public: virtual void foobar(); }; example.cpp ----------- #include <iostream> using namespace std; #include "Example.h" void P1::foobar() { cout << "P1" << endl; return; } void C1::foobar() { cout << "C1" << endl; return; } void P2::foobar() { cout << "P2" << endl; return; } void C2::foobar() { cout << "C2" << endl; return; } test.cpp -------- #include <stdlib.h> #include "Example.h" int main(int argc,char *argv[]) { P1 *p1 = new P1(); p1->foobar(); P2 *p2 = new P2(); p2->foobar(); C1 *c1 = new C1(); c1->foobar(); C2 *c2 = new C2(); c2->foobar(); P1 *m1 = new C1(); m1->foobar(); P2 *m2 = new C2(); m2->foobar(); exit(EXIT_SUCCESS); }
og det er P2 *m2 = new C2(); som illusterer polymorfisme
Svaret er vel at polymorfi ikke er muligt i C, men er det C++ du mener, er det et udmærket eksempel arne_v har lavet til dig.
ups - jeg fik vist ikke læst overskriften godt nok
C understøtter ikke klasser og derfor naturligvis ikke polymorfisme i sproget. Men man kan godt emulere en C++ virtual metode i C ved at bruge en function pointer. Sammenlign disse 2 stykker kode. oo.cpp ------ #include <iostream> using namespace std; class A { public: int va; A(); virtual void f1() = 0; }; class B : public A { public: int vb; B(); virtual void f1(); void f2(); }; A::A() { va = 123; } B::B() { vb = 456; } void B::f1() { cout << va << endl; } void B::f2() { cout << vb << endl; } int main() { B *b = new B(); b->f1(); b->f2(); delete b; return 0; } oo.c ---- #include <stdio.h> struct A { int va; void (*f1)(struct A *a); }; struct B { int va; void (*f1)(struct A *a); int vb; }; void constructorA(struct A *a) { a->va = 123; a->f1 = NULL; } void f1B(struct A *a); void constructorB(struct B *b) { constructorA((struct A *)b); b->f1 = f1B; b->vb = 456; } void f1B(struct A *a) { printf("%d\n",a->va); } void f2(struct B *b) { printf("%d\n",b->vb); } int main() { struct B *b = (struct B *)malloc(sizeof(struct B)); constructorB(b); b->f1((struct A *)b); f2(b); free(b); return 0; }
Spørgsmålet gik på c ikke cpp
ups, sorry det var en kommentar til den første post :) takker for det andet svar arne_v
Kurser inden for grundlæggende programmering