Avatar billede madslee Nybegynder
29. oktober 2003 - 22:13 Der er 11 kommentarer og
1 løsning

virtuale funktioner

Hej sidder og roder lidt med OOP og er nået til virtuale funktioner kan ikke helt forstå hva de skal gøre godt for ..

altså som jeg ser det har de ikke rigtigt nogen virkning og det ved jeg ikke er rigtigt
men hva er det entligt de giver en tilladelse til

har prøvet at rodet lidt med noget nedarvning med og uden virtuale funktioner og kan ikke rigtigt få øje på forskellen!..

nogne der kan give et eksemple på hva det er og hvad fordelen er ?
Avatar billede arne_v Ekspert
29. oktober 2003 - 22:17 #1
Når man kalder en virtuel funktion så kalder man funktionen i det
instantierede objekt ikke i det erklærede objekt.
Avatar billede arne_v Ekspert
29. oktober 2003 - 22:18 #2
Jeg kommer lige med et eksempel !
Avatar billede arne_v Ekspert
29. oktober 2003 - 22:19 #3
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
29. oktober 2003 - 22:21 #4
Forskellen er at:

m1->foobar(); // kalder P1 foobar fordi den ikke er virtual

m2->foobar(); // kalder C2 foobar fordi den er virtual
Avatar billede arne_v Ekspert
29. oktober 2003 - 22:22 #5
Ja - jeg ved godt at det er lidt svært at gennemskue.
Avatar billede arne_v Ekspert
29. oktober 2003 - 22:23 #6
Som hoved-regel bør alle metoder man planlægger at overide i en
sub-klasse erklæres virtual.

Det er ganske usandsyneligt at man vil ønske sig ikke-virtual effekten.

I sproget Java er alle metoder virtual uden undtagelse. Ikke noget
at rafle om.
Avatar billede arne_v Ekspert
29. oktober 2003 - 22:23 #7
Og et svar
Avatar billede olennert Nybegynder
30. oktober 2003 - 09:55 #8
Og så skal du i C++ huske, at hvis du ønsker at nedarve fra en klasse du laver, så skal du erklære destructoren virtual. Ellers risikerer du den forkerte destructor bliver kaldt.
Avatar billede madslee Nybegynder
30. oktober 2003 - 20:52 #9
forstår bare ikke fordelen ???... altså hvorfor bør man erklære dem virtual ??

hvorfor ikke bare kalde funktionen man vil uden at skulle tænke på at hvis man kalder en funktion i en klasse så bliver en anden funktion i en anden klasse kaldt istedet ?
Avatar billede arne_v Ekspert
30. oktober 2003 - 20:59 #10
Forskellen på virtual og ikke virtual kommer til udtryk når man har
en klasse B der arver fra klassen A og man instantierer som:

A *o = new B();

og kalder en metode:

o->f();

Ved en ikke virtuel f så vil A::f blive udført.

Ved en virtuel f så vil B::f blive udført.

Man vil så godt som altid have B::f udført - derfor virtual.
Avatar billede arne_v Ekspert
30. oktober 2003 - 21:00 #11
Så kan du synes at konstruktion med at sige:

basis klasse = afledt klasse

er mærkelig, men det er en meget brugt feature i objekt orienteret
programmering (GoF patterns etc.).
Avatar billede madslee Nybegynder
30. oktober 2003 - 21:14 #12
okai tak for hjælpen :)... på nuværende tidspunkt kan jeg ikke se hva jeg skal bruge det til hehe men det kommer nok når man kommer lidt mere ind i det :P
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