Ich bin neu in C++ als ich den Wechsel von Java/C# gemacht habe. Kann jemand erklären, warum mein Code nicht funktioniert, wie ich denke, dass es sollte. Ich habe eine einfache Hierarchie der Tierklasse, die dann von Hund und Katze geerbt wird. Der einzige Unterschied zwischen den Klassen ist ihre virtuelle Methode toString() /, die offensichtlich eine Zeichenkette zurückgibt, basierend auf welcher der Klassen sie aufgerufen wird. Okay, ich gebe Informationen ein und erstelle die Klassen mit CIN und schiebe sie in einen Vektor von Animals. Wenn ich jedoch versuchte, ihre toString() aufzurufen, bekam ich das Ergebnis von der Basis toString() und nicht das überschriebene. Hier ist der Code an dieser Stelle:C++ Aufruf von Override-Funktionen führt zum Aufruf der Basisfunktion
#include <iostream>
#include <vector>
#include "animal.h"
#include "cat.h"
#include "dog.h"
using namespace std;
int main()
{
vector<Animal> animals;
string type;
string name;
int age;
int weight;
while(cin >> type){
cin >> name >> age >> weight;
if(type == "dog"){
animals.push_back(Dog(name, age, weight);
}
else {
animals.push_back(Cat(name, age, weight);
}
}
for(vector<Animal>::iterator iter = animals.begin(); iter != animals.end();
iter++){
cout << iter -> toString() << endl;
}
return 0;
}
Aber dann, nachdem ich einige googeln habe ich einen Vorschlag gefunden, dass ich wegen etwas genannt Objekt Slicing verwenden Zeiger sollte. Also dann drehte meinen Code in diese:
#include <iostream>
#include <vector>
#include "animal.h"
#include "cat.h"
#include "dog.h"
using namespace std;
int main()
{
vector<Animal*> animals;
string type;
string name;
int age;
int weight;
while(cin >> type){
cin >> name >> age >> weight;
if(type == "dog"){
Dog tempDog(name, age, weight);
animals.push_back(&tempDog);
}
else {
Cat tempCat(name, age, weight);
animals.push_back(&tempCat);
}
}
for(vector<Animal*>::iterator iter = animals.begin(); iter != animals.end();
iter++){
cout << iter -> toString() << endl;
}
return 0;
}
Und jetzt habe ich einen Compiler-Fehler bin immer darauf hindeutet, sollte ich verwenden ‚->‘;
Auch eine Nebenfrage, während ich hier bin möchte ich fragen. Gibt es eine Möglichkeit, eine virtuelle Methode aus der CPP-Datei und nicht die Header-Datei, in der die Klasse definiert ist, zu überschreiben. Ich bin vor kurzem in den oop in C++ und meine Idee ist, dass ich in der Header-Datei nur Prototypen der Mitglieder der Klasse definieren und ich die Implementierung in einer anderen CPP-Datei.
Es ist https://en.wikipedia.org/wiki/Object_slicing. Hier ist die Antwort: http://stackoverflow.com/questions/274626/what-is-object-slicing – fukanchik
Oh, und bitte lesen Sie auch dieses: http: // stackoverflow.com/questions/408670/stack-static-and-heap-in-c Es ist keine gute Idee, die Adresse von Heap-Objekten zu speichern – fukanchik
Speichern Sie den Zeiger des temporären Objekts nicht (was Sie mit Ihrem tempDog und tempCat tun). Sie sollten sie dynamisch erstellen. – zoska