Implementierte Rein Virtuelle Methode?
Hier ist das problem: ich erhalte die implementierte rein virtuelle Methode Fehler beim kompilieren. Ich habe bisher alle die rein virtuellen Methoden der abstrakten Basisklasse. Irgendwelche Ideen?
hier ist die abstrakte Basis-Klasse:
class record{
public:
virtual int getID()=0;
virtual record *clone();
};
und die Umsetzung:
class sdata: public record{
public:
sdata(std::string s = ""){data=s; ID=atoi(data.substr(0,8).c_str());}
virtual int getID(){return ID;}
private:
std::string data;
int ID;
};
sorry, hier ist die komplette Fehlermeldung:
Implementierte rein virtuelle Methode 'getID' in 'record'
Vielleicht dieses bit des Codes den Fehler verursacht, dann:
int hashTable::hash(record *x) {
return floor(m * (x->getID() * A - floor(x->getID() * A)));
}
Nicht, ohne dass der entsprechende code...
Vergessen Sie nicht, die consts. Aber ja, sehen Sie den code könnte in der Lage sein zu helfen ein wenig.
Siehe z.B. stackoverflow.com/questions/2609299/....
Funktioniert Klasse Datensatz haben eine Implementierung von clone()? Vielleicht ist dein compiler hält es für pure virtual, wenn keine Implementierung vorhanden, die irgendwo in der Hierarchie.
Sie sollte wohl zeigen den code, der den Fehler erzeugt. Fügen Sie auch
Vergessen Sie nicht, die consts. Aber ja, sehen Sie den code könnte in der Lage sein zu helfen ein wenig.
Siehe z.B. stackoverflow.com/questions/2609299/....
Funktioniert Klasse Datensatz haben eine Implementierung von clone()? Vielleicht ist dein compiler hält es für pure virtual, wenn keine Implementierung vorhanden, die irgendwo in der Hierarchie.
Sie sollte wohl zeigen den code, der den Fehler erzeugt. Fügen Sie auch
override
auf die Erklärung von getID
in der abgeleiteten Klasse und sehen was passiert.
InformationsquelleAutor mlclmss | 2013-04-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ohne dass der code der den Fehler verursacht, ist es schwierig, genau zu wissen, was Los ist. Wenn dies ist eine compile-Zeit-Fehler sehe ich nicht ein, hier irgendetwas bewirken würde.
Allerdings, wenn Sie sehen, ein runtime-error, die beiden häufigsten Ursachen dafür, dass ich denken kann, sind:
(1) Aufruf der Memberfunktion aus der Basisklasse Konstruktor oder Destruktor (auch nicht indirekt).
(2) Der abgeleiteten Klasse die Basisklasse aufrufen, die version der Funktion, ohne dass es umgesetzt wird.
Ein Beispiel zeigt diese beiden Fehler wäre:
== UPDATE: Möglich compile-Zeit-Fehler ==
Beobachte ich in deinem Beispiel-code, der Datensatz hat eine nicht-rein-virtuelle clone () - Memberfunktion der Rückkehr eine
record *
. Seit der Aufzeichnung ist Abstrakt, Sie können nicht erstellen Sie einen Datensatz direkt (nur seine konkrete Unterklassen). Dies deutet darauf hin, dass Ihre clone () - member-Funktion sollte wohl auch rein virtuell, wenn es versucht, (zum Beispiel)return new record()
Sie eine Fehlermeldung erhalten, dass Ihre Basis-Klasse hat rein virtuelle Funktionen.Könnte es sein, aber es hängt davon ab, was Sie tatsächlich übergeben als parameter.
Wenn dieser code aufgerufen wird, oder von innerhalb der record-Konstruktor (direkt oder indirekt), dass würde den Fehler verursachen. Wenn es aufgerufen wird, nach sdata Konstruktor gestartet wird, aber bevor sdata ' s Destruktor abgeschlossen ist, sollte es nicht zu einem problem führen.
Ich hatte das exakt gleiche Problem und stellt sich heraus, ich hatte eine std::vector von meiner virtuellen Objekt, anstelle von Zeigern. Der Nachteil ist, dass ich jetzt löschen muss, alle Zeiger danach.
InformationsquelleAutor Adam H. Peterson
Es klingt wie Sie nicht implementiert alle Funktionen, die von der abstrakten Basisklasse. Wenn eine Funktion in der Basis hat die Signatur:
Und implementieren Sie das folgende in deiner abgeleiteten Klasse:
Dann haben Sie nicht implementiert haben die Funktion, da Sie die weggelassen
const
. GCC sollte Ihnen sagen, was Sie nicht umsetzen.Zusammenhang: wenn Sie eine konkrete Umsetzung der base, Sie hätte versteckt sein name in der abgeleiteten Klasse. Finden Sie Funktionen, die Sie sind, [versehentlich] verbergen, verwenden Sie
-Woverloaded-virtual
.InformationsquelleAutor jww