C++ Vererbungsverwirrung
*Markus
- sonstiges
Hallo,
so wie ich es verstanden habe, wäre das, was man in Java in der abgeleiteten Klasse als super(ARGUMENTE..) schreibt, in C++ der Konstruktor der Basisklasse. Es scheint aber so nicht zu funktionieren. Ich bekomme folgende Fehlermeldung beim kompilieren:
markus@gentoo ~/C++-Programme $ g++ 03_person.cpp -o 03_person
03_person.cpp: In constructor »Schueler::Schueler(int, int, std::string)«:
03_person.cpp:47: Fehler: keine passende Funktion für Aufruf von »Person::Person()«
03_person.cpp:38: Anmerkung: Kandidaten sind: Person::Person(int, int, std::string)
03_person.cpp:7: Anmerkung: Person::Person(const Person&)
Hier das Beispielprogrämmchen:
#include <iostream>
#include <sstream> //stringstream
#include <string>
using namespace::std;
class Person {
protected:
int alter;
int groesse;
string name;
public:
Person(int a, int g, string n);
~Person();
void setAlter(int a);
int getAlter() const;
void setGroesse(int g);
int getGroesse() const;
void setName(string n);
string getName() const;
string toString();
};
class Schueler : public Person {
private:
int note;
public:
Schueler(int a, int g, string n);
~Schueler();
void setNote(int n);
int getNote() const;
};
Person::Person(int a, int g, string n) {
setAlter(a);
setGroesse(g);
setName(n);
}
Person::~Person() {
}
Schueler::Schueler(int a, int g, string n) {
Person(a, g, n);
}
Schueler::~Schueler() {
}
void Person::setAlter(int a) {
alter = a;
}
int Person::getAlter() const {
return alter;
}
void Person::setGroesse(int g) {
groesse = g;
}
int Person::getGroesse() const {
return groesse;
}
void Person::setName(string n) {
name = n;
}
string Person::getName() const {
return name;
}
string Person::toString() {
string buf;
stringstream strstream;
buf = "Name:" + name;
strstream << alter;
buf += ", Alter:" + strstream.str();
strstream.clear();
strstream.str("");
strstream << groesse;
buf += ", Größe:" + strstream.str();
return buf;
}
void Schueler::setNote(int n) {
note = n;
}
int Schueler::getNote() const {
return note;
}
int main(void) {
Person *markus = new Person(27, 178, "Markus");
cout << markus->toString() << endl;
Schueler *binci = new Schueler(25, 165, "Bianca");
binci->setNote(1);
return 0;
}
Markus
Gelöst:
Der Konstruktor von Schueler muss so aussehen:
Schueler::Schueler(int a, int g, string n) : Person(a,g,n) {
}
Hallo Markus,
03_person.cpp:47: Fehler: keine passende Funktion für Aufruf von »Person::Person()«
Die Fehlermeldung ist etwas verwirrend, da sie zwar in Zeile 47 auftaucht, in der zwar Person (...) steht, allerdings sich auf die vorige Zeile bezieht. Du schreibst:
Schueler::Schueler(int a, int g, string n) {
Person(a, g, n);
}
Korrekt wäre:
~~~c++
Schueler::Schueler(int a, int g, string n) : Person(a, g, n) {
}
Viele Grüße,
Christian