*Markus: C++ Vererbungsverwirrung

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

--
http://www.apostrophitis.at
六 7東曲 人港ラ
  1. Gelöst:

    Der Konstruktor von Schueler muss so aussehen:

      
    Schueler::Schueler(int a, int g, string n) : Person(a,g,n) {  
    }  
    
    
    --
    http://www.apostrophitis.at
    六 7東曲 人港ラ
  2. 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

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup