2016-04-17 11 views
1

Ich bin ein bisschen neu in C++ Objektprogrammierung und brauche ein wenig Hilfe.C++ Aufruf Methode aus der Unterklasse in der Oberklasse

Sagen wir, ich habe die Klasse Animal und die Unterklasse cat. Im Hauptprogramm habe ich ein Array von Zeigern zu Tier, wie folgt aus:

Animal* array[10]; 
array[0] = new Cat(); 

Subklassen-Katze, die seine eigene integer hat, und ein Verfahren getType diese ganze Zahl zurückzukehren. Ich würde gerne wissen, wie ich diese Methode nenne.

Ich habe versucht:

array[0]->getType() 

Aber es sagt, könnte diese Methode nicht aufgelöst werden, und diese Klasse Tier hat kein Mitglied namens getType. Ich habe auch versucht, diese Methode virtuell zu machen und immer noch nicht funktioniert. Irgendwelche Lösungen?

Mit freundlichen Grüßen

Antwort

-2

Sie benötigen Cat *, um getType() anrufen zu können. In C++ werden Zeiger mithilfe von casting operators konvertiert (casted).


Wenn Sie sicher sind (dies Sie wieder in größeren Programmen beißen kann), dass Ihre array[0] ist wirklich zeigt auf ein Objekt der Klasse Cat, können Sie verwenden (siehe ideone für vollständige Programm)

Cat * catPtr = static_cast<Cat *>(array[0]); 
catPtr->getType(); 

oder, prägnant,

static_cast<Cat *>(array[0])->getType(); 

Beachten Sie, dass diese kläglich scheitern, wenn array[0] nicht zu-Zeiger.


Solange Ihre Klassen polymorph sind (enthalten virtuelle Mitglieder), die, in Ihrem Fall (Array von Basisklassenzeigern und abgeleitete Methoden ausgeführt wird) wahrscheinlich der Fall sein sollte, Sie dynamic_cast statt static_cast verwenden können. Es verursacht Laufzeit-Overhead, überprüft jedoch, ob die Konvertierung gültig ist, und gibt nullptr zurück, wenn dies nicht der Fall ist.

+0

Vielen Dank, das funktioniert perfekt in meinem Fall! – timcheee

+0

@timcheee Beachten Sie, dass, während dies funktioniert, das Schreiben von Code auf diese Weise eine schlechte Übung ist (deshalb wurde meine Antwort nach unten verschoben). Versuche Ansätze in anderen Menschen Antworten. –

+0

Bevor ich diesen Satz mache, überprüfe ich die IF-Anweisung, wenn das Array [i] ein Zeiger auf Cat ist, also bin ich mir sicher, dass ich keine anderen Subklassen in Cat umwandeln werde – timcheee

-1

Wenn ich mich richtig erinnere, müssen Sie die Array [0] als Cat Art werfen. So würde es so sein

dynamic_cast<Cat>(array[0])->getType(); 

Dies ist mein erster Beitrag und ich habe nicht versucht, meinen Vorschlag, so dass ich im Fall entschuldigen, das ist falsch.

1

Sie müssen es virtuell in der Basisklasse erklären, Beispiel:

virtual void getType() { cout << "Animal" << '\n'; } 

Und in der abgeleiteten Klasse können Sie es außer Kraft setzen:

void getType() override { cout << "Cat" << '\n'; } 

Jetzt können Sie array[0]->getType() anrufen und es wird verwenden die überschriebene Cat::getType()

+0

Das ist eigentlich eine bessere Antwort als meine. Das Hinzufügen von 'getType()' Körpern wäre jedoch nett. –

0

Scheint mir, Sie wollen mehrere Unterklassen von Animal haben, die die gleichen Methoden haben werden und dass Sie das Array Animal * verwenden werden, um die Methoden der Unterklassen aufzurufen. Wenn dies der Fall ist, dann sollten Sie Animal Klassenmethoden machen virtual:

  1. alle erklären die Methoden (die Sie wollen, dass alle Ihre Unterklassen müssen) in Animal Klasse
  2. Wenn sie eine „default“ Implementierung haben, setzte sich in Animal
  3. Andernfalls machen sie virtuelle rein in Animal (siehe Beispiel)
  4. in Unterklassen, außer Kraft setzen rein virtuelle Methoden und solche, die nicht-Standard haben Implementierung

So Ihre Animal Klasse sollte wie folgt aussehen:

class Animal { 
    public: 
     virtual int getType() = 0; // purely virtual function 
}; 

und Ihre Cat Klasse sollten die Methoden außer Kraft setzen (beachten Sie, dass die override Kennung nicht notwendig ist, obwohl empfohlen)

class Cat : public Animal { 
    public: 
     int getType() override { 
      return 42; 
     } 
}; 

Diese erlaubt

Animal * array[10]; 
array[0] = new Cat(); 
std::cout << array[0]->getType() << std::endl; 
zu haben 0

, die 42 drucken wird. Siehe ideone example.

Verwandte Themen