Avatar billede krismort Nybegynder
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.
Avatar billede arne_v Ekspert
11. juli 2005 - 21:27 #1
erklær dine metoder for virtual
Avatar billede arne_v Ekspert
11. juli 2005 - 21:28 #2
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);
}
Avatar billede arne_v Ekspert
11. juli 2005 - 21:42 #3
og det er

P2 *m2 = new C2();

som illusterer polymorfisme
Avatar billede driis Nybegynder
11. juli 2005 - 23:28 #4
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.
Avatar billede arne_v Ekspert
12. juli 2005 - 00:04 #5
ups - jeg fik vist ikke læst overskriften godt nok
Avatar billede arne_v Ekspert
12. juli 2005 - 00:14 #6
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;
}
Avatar billede krismort Nybegynder
12. juli 2005 - 11:24 #7
Spørgsmålet gik på c ikke cpp
Avatar billede krismort Nybegynder
12. juli 2005 - 11:25 #8
ups, sorry det var en kommentar til den første post :)
takker for det andet svar arne_v
Avatar billede arne_v Ekspert
24. juli 2005 - 15:16 #9
så ligger jeg et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester