27. april 2002 - 18:06 Der er 3 kommentarer og
1 løsning

Polymorfi + nedarvning

#include <iostream>
#include <vector>

using namespace std;

class hest {
public:
    hest::hest()
    {}

    virtual void hest::getType()
    {
        cout<<"Hest"<<endl;
    }
};

class pegasus: public hest {
public:
    pegasus::pegasus()
    {}

    void pegasus::getType()
    {
        cout<<"Pegasus"<<endl;
    }

};

void main() {
    vector<hest> vektor;
   
    hest v1;
    pegasus v2;

    vektor.push_back(v1);
    vektor.push_back(v2);

    for (int i = 0; i<vektor.size(); i++)
        vektor[i].getType();
                // HER VILLE JEG GERNE HAVE AT PRG.
                // UDSKRIVER HEST PEGASUS
                // MEN DET UDSKRIVER KUN HEST HEST
}

Mit problem er at jeg gerne vil lave en vektor af heste (dvs. af superklassen hest samt subklassen pegasus), men programmet skal kunne skelne mellem om det er en hest eller en pegasus. Når ovenstående kode køres udskrives hest i begge tilfælde, her ville jeg gerne have den til at skrive hest og pegasus, da v2 er en pegasus. Som jeg har forstået det, så skal der i vector angives type dvs. superklassens type eller hvad? Måske har jeg misforstået dette! Er der i c++ en generel objekterklæring, så vector tager imod alle objekter uanset type?

Er der en som kan hjælpe mig videre?

På forhånd tak!
/PC
Avatar billede cms Nybegynder
27. april 2002 - 18:46 #1
Nu er jeg på besøg ovre fra Delphi-kategorien, så dette er muligvis ikke rigtigt. Men jeg forsøger...

#include <iostream>
#include <vector>

using namespace std;

class chest {
  public:
  virtual void getType();
};

class cpegasus: public chest {
  public:
  void getType();
};

void chest::getType()
{
  cout<<"Hest"<<endl;
}

void cpegasus::getType()
{
  cout<<"Pegasus"<<endl;
}

void main() {
    vector<chest*> vektor; //Vi skal have en pointer til en classinstance, ikke en class.
   
    chest* v1 = new chest; //Den skal jo initialiseres!
    cpegasus* v2 = new cpegasus; //Den skal jo initialiseres!

    vektor.push_back(v1);
    vektor.push_back(v2);

    for (int i = 0; i<vektor.size(); i++)
      vektor[i]->getType(); // '->' er når det til venstre er en pointer til en class
}
Avatar billede tson Nybegynder
27. april 2002 - 19:00 #2
Hej pc,

** Polymorfi er i C++ kun understøttet via pointers og references **

En uddybende forklaring:

hest h1;
pegasus p1;

hest *p1 = &p1;
hest &r1 = p1;
hest h2 = p1; // Bit slicing occurs

p1->getType(); // returns "Pegasus"
r1.getType(); // returns "Pegasus"
h2.getType(); // returns "Horse"

Når du kaster fra en objekt-type til en super-klasse slices (skæres) alt fra underklassen væk. Det er derfor sjældent nyttigt og oftest en fejl.

vector<MyType> templaten bruger value-semantics, hvilket betyder at du ikke kan holde subclasses af MyType i vektoren.

Løsningen er at bruge pointere. Hvis du ikke vil selv vil holde styr på memory allokering/deallokering så kan du bruge reference-counting smart-pointers. Det er ikke svært at skrive dem selv, men det nemmeste er nu nok at downloade en implementation fra f.eks. http://www.boost.org.
27. april 2002 - 19:17 #3
Hej cms og tson,

Tak for hjælpen. Cms løb af med pointene denne gang, da løsningen lige præcist var det jeg havde brug for. Det spiller maxzz.
Avatar billede tson Nybegynder
27. april 2002 - 19:22 #4
Fair nok, bemærk dog at hans program leaker memory, da objekter allokeret med new skal deallokeres med delete.
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