2016-04-01 3 views
0

Ich habe derzeit ein Problem mit einem Konzept, das Vererbung und Arrays von abgeleiteten Objekten beteiligt. Ich habe ein Zeiger-Array erstellt und es entweder mit einer Basisklasse oder einer abgeleiteten Klasse gefüllt, abhängig davon, ob die Array-Position gerade oder ungerade ist. Wenn ich die birdType-Funktion aufrufen, verwenden alle Objekte in dem Array jedoch die Basisklassenfunktion, obwohl die Array-Objekte der geraden Anzahl die überschriebene Versionsfunktion verwenden sollten. Ich habe versucht, virtuellen Aufruf Mechanismus auf der Basisfunktion zu verwenden, aber das scheint das Programm abstürzt.Verwendung von überschriebenen Funktionen in einem Basisklassen-Array

Der Code in Frage:

class bird{ 
public: 
    void birdType(){cout<<"I am a bird.\n";} 
}; 
class sparrow:public bird 
{ 
    void birdType() { cout <<"I am a sparrow.\n";} 
}; 

int main(){ 
    bird *collection[5]; 
    for (int i = 0; i < 5; ++i) { 
     if (i % 2 != 0) 
     { 
      collection[i] = new bird; 

     } 
     else if (i % 2 == 0) 
     { 
      collection[i] = new sparrow; 
     } 



    } 
    for(int j=0;j<5;++j)collection[j]->birdType();; 
} 

und die aktuelle Ausgabe:

I am a bird 
I am a bird 
I am a bird 
I am a bird 
I am a bird 

Antwort

0

Sie benötigen die birdType() Funktion in der Basisklasse (Vogel) virtuell zu machen. Wenn es nicht virtuell ist, erhalten Sie nicht die Vererbung, die Sie wünschen.

virtual void birdType(){cout<<"I am a bird.\n";} 

sollte den Trick tun.

+0

hey danke für die schnelle antwort, ich muss etwas anders gemacht haben, wenn ich dies umgeschrieben habe, weil virtual scheint jetzt zu arbeiten. vorher stürzte mein Programm mit virtual auf der Basisfunktion ab. – LOUDNOODLES

+0

@LOUDNOODLES Ich bin froh, es zu hören! Verstand, dies als Antwort zu akzeptieren? – mwm314

Verwandte Themen