Fehler: keine ‘ member-Funktion deklariert in der Klasse "
Ich versuche, erstellen Sie eine Klasse, die eine virtuelle Funktion, die ich gerne Erben in zwei untergeordnete Klassen.
Ich weiß, dass einige Leute bereits gefragt, diese (hier und es zum Beispiel), aber ich konnte nicht die Antwort zu verstehen.
Also machte ich ein Vereinfachtes Beispiel-code von dem, was ich versuche :
//Mother .h file
#ifndef _MOTHER_H_
#define _MOTHER_H_
#include <iostream>
class Mother
{
protected :
std::string _name;
public:
Mother(std::string name);
~Mother();
virtual std::string getName() = 0;
};
#endif
//Mother .cpp file
#include "Mother.h"
Mother::Mother(std::string name)
{
this->_name = name;
}
Mother::~Mother()
{
}
//Child.h file
#ifndef _CHILD_H_
#define _CHILD_H_
#include "Mother.h"
class Child : public Mother
{
private :
std::string _name;
public:
Child(std::string name);
~Child();
};
#endif
//Child .cpp file
#include "Mother.h"
#include "Child.h"
Child::Child(std::string name) : Mother(name)
{
this->_name = name;
}
Child::~Child()
{
}
std::string Mother::getName()
{
return this->_name;
}
Hier ist meine main.cpp Datei :
//Main.cpp file
#include "Child.h"
int main()
{
Child l("lol");
std::cout << l.getName() << std::endl;
Mother& f = l;
std::cout << f.getName() << std::endl;
return 0;
}
Hier ist, was der compilator sagt :
(kompilieren mit g++ *.cpp -W -Wall -Wextra -Werror)
main.cpp: In function ‘int main()’:
main.cpp:5:9: error: cannot declare variable ‘l’ to be of abstract type‘Child’
In file included from main.cpp:1:0:
Child.h:8:7: note: because the following virtual functions are pure within ‘Child’:
In file included from Child.h:6:0,
from main.cpp:1:
Mother.h:14:23: note: virtual std::string Mother::getName()
Was mache ich falsch ?
(sorry, wenn ich einige Deutsch Fehler, ich bin kein native speaker).
Sie haben nicht überschrieben, die rein virtuelle Funktion getName() in der Kind-Klasse.
Sie implementieren müssen, um getName () - Funktion in Ihrem Kind Klasse.
Warum ist getName() rein?
Kinder nicht wirklich Erben von Müttern in der OOP-Welt.
Die Namen von include-guards verwenden reservierte Bezeichner, stackoverflow.com/questions/228783/...
Sie implementieren müssen, um getName () - Funktion in Ihrem Kind Klasse.
Warum ist getName() rein?
Kinder nicht wirklich Erben von Müttern in der OOP-Welt.
Die Namen von include-guards verwenden reservierte Bezeichner, stackoverflow.com/questions/228783/...
InformationsquelleAutor trolologuy | 2014-01-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
In
Mother
's Erklärung, die Sie haben:Dies ist nicht nur ein
virtual
, aber ein Reinevirtual
. Die Unterscheidung zwischen einemvirtual
und ein Reinevirtual
ist, dass die Reine Vielfalt muss haben ein überschreiben der Implementierung in einer abgeleiteten Klasse, auch wenn Sie eine Implementierung in der Basisklasse. Zum Beispiel:Kann man nicht instanzieren einer Klasse mit un-implementiert Reine
virtual
Methoden. Wenn Sie versuchen, erhalten Sie einen compiler-Fehler:Und das ist genau das, was Sie zu tun versucht. Sie erklärt
getName()
werden Reinevirtual
imMother
, aber Sie nicht außer Kraft setzen, inChild
. Dann Sie versucht zu instanziierenChild
Führte im Ergebnis zu der compiler-Fehlermeldung.
Um es zu beheben, geben Sie eine überschreibung von
getName()
imChild
Klasse.std::string Child::getName() { return Mother::getName(); }
?Vielen Dank ! Jetzt habe ich verstanden, mein Fehler ! 🙂 Ich verstehe immer noch nicht die Logik dahinter, aber jetzt habe ich jetzt, wie es zu benutzen.
das wird nicht kompilieren. Es gibt keine Umsetzung in 'Mutter'
Es ist, nach unten scrollen, den code in die Frage, die alle dem Weg nach unten.
Ah, ja, hatte ich übersehen.
InformationsquelleAutor John Dibling
Du
class child
überschreiben solltengetName()
Methode, wie es istpure virtual
definiert inclass
mother
Scheint typo zu mir.. wie
std::string Mother::getName()
definiert ist, inchild.cpp
..Infact, ist falsch.. es sollte kein name der Funktion getName in der Klasse Mutter... wie ist es Reine virtuelle (Körper =0). In diesem Beispiel, es muss nur eine getName ..und dass muss sein Kind!
Gut, dass die definition für rein virtuelle Funktion in der Klasse, wo es erklärt wurde, ist nicht gegen den standard. Es würde Ihnen erlauben, zu implementieren
Child::getName
alsreturn Mother::getName()
.ja, aber ich bin nicht wirklich sicher, ob die Definition einer pure-virtual-Funktion macht keinen Sinn!!
InformationsquelleAutor Digital_Reality
Die rein virtuelle Funktion in der Basisklasse Mutter macht keinen Sinn, von einem OOP-Sicht ist es ein gemeinsames Merkmal aller Kinder, die also die gleiche Funktion verwendet werden konnte. Es gibt keine Notwendigkeit, um es zu überschreiben.
InformationsquelleAutor Anders