Funktion bei Vererbung verlorengegangen

  • Themenstarter Themenstarter B_C
  • Beginndatum Beginndatum
B

B_C

Sers!

Es geht um folgende Fehlermeldung:
15 H:\Cpp\Projekte\Hello World\Trafficlight_3.cpp
no `void Trafficlight_3::Status()' member function declared in class `Trafficlight_3'

Nun gut, insoweit hat der compiler sogar recht. In Trafficlight_3 hab ich diese Funktion nicht deklariert, wohl aber in der Basisklasse Trafficlight. Dort steht sie als "protected", also sollte Trafficlight_3 die Funktion doch kennen, oder

Hier mal der Code:

"Trafficlight.h"
Code:
#ifndef TRAFFICLIGHT
#define TRAFFICLIGHT

#include <string>

using namespace std;

class Trafficlight
{
public:
  Trafficlight(int); 

       
protected:
  int Lightcount; 
  int i_ID; 
  string s_ID; 
  string ID_Output; 
  bool Red,Green; 
  void Status(void);
};

#endif


"Trafficlight.cpp"
Code:
#include <sstream>
#include "Trafficlight.h"

using namespace std;

Trafficlight::Trafficlight(int ID)
{
  Red=true;       
  Green=false;              
  
  stringstream sstr;         
  i_ID=ID;
  sstr<<i_ID;             
  sstr>>s_ID;                
  ID_Output="TL "+s_ID+": ";    
}


"Trafficlight_3.h"
Code:
#include <string>
#include "Trafficlight.h"

using namespace std;

class Trafficlight_3 : public Trafficlight
{
public:
  Trafficlight_3(int); 
  void SetLights(bool,bool,bool);
       
       
private:
  bool Yellow;
};


"Trafficlight_3.cpp"
Code:
#include <iostream>
#include "Trafficlight_3.h"

using namespace std;

Trafficlight_3::Trafficlight_3(int ID) : Trafficlight(ID)
{
  Yellow=false;           
  Lightcount=3;              

  Status();
}

void Trafficlight_3::Status(void) 
{
  cout<<ID_Output<<"Red = "<<Red<<", Yellow = "<<Yellow<<", Green = "<<Green<<"\n";
}

void Trafficlight_3::SetLights(bool RED,bool YELLOW,bool GREEN)
{
  Red=RED;
  Yellow=YELLOW;
  Green=GREEN;
  Status();
}

Es gibt noch nen Trafficlight_2 (mit 2 statt 3 Lichtern) wo der Fehler auch auftritt. Aber dürfte wohl eh bei beiden die selbe Ursache haben.
Wie kann es jetzt sein, dass Trafficlight_3 "void Status()" nicht kennt? Was mich daran am meisten irritiert: Status() ist das einzige worüber er meckert. Die ganzen Membervariablen sind für ihn kein Problem.

Freu mich schon auf Antworten...

Björn
 
Hi.

Wenn du eine Methode in einer abgeleiteten Klasse überschreiben willst, dann mußt du das in der Klassendefinition auch angeben:
C++:
class A {
protected:
  void f1();
  void f2();
};

class B : public A {
protected:
  void f2();
};

void B::f2() { } // OK

void B::f1() { } // Error
Bitte poste nächstes Mal die vollständige Fehlermeldung und sag dazu in welcher Zeile der Fehler auftritt!

Gruß
 
Das war die vollständige Fehlermeldung ;-)
Und die Zahl davor war die Zeile, aber da geb ich zu, dass das nicht unbedingt offensichtlich war^^

Auf jeden Fall danke für die Info!

Schöne Grüße,
Björn
 
Welchen Compiler verwendest du denn?

PS: Auch hier würde ich von using namespace std; abraten. Früher oder später wirst du Konflikte bekommen, je mehr Elemente aus dem std-Namespace du includierst! Verwende using gezielt und nicht à la Rundumschlag:
Code:
using std::stringstream;
 
Danke für den Tipp!

Ich benutze den Default Compiler von Dev-C++
Welcher das genau ist: keine Ahnung xD
 
Ich glaube, das ist MinGW. ABER ich würde dir von Dev-C++ abraten, wird nicht mehr weiterentwickelt. Ich benutze momentan Code::Blocks.
 
Ja, eigentlich ist Dev-C++ auch nicht unbedingt mein lieblingsprogramm. Eigentlich hätte ich von mir aus nichtmal c++ benutzt. Aber leider bin ich wohl mehr oder weniger dazu gezwungen es zu benutzen (von der Schule aus)
 
Hi

Um nochmal aufs Anfangsthema zurück zu kommen: In C++ gibt es zwei Grundsätzliche Konzepte für vererbte Funktionen.
  • Function-Hiding: Das ist das was dir oben schon beschrieben wurde
  • Overriding: Dazu muss die Funktion in der Basisklasse als virtual markiert werden.
C++:
class Person {
  public:
  Person(const string &name);
  virtual void SaySomething();
  };
C++:
class Student : public Person {
  public:
  Student(const string &name, int matrnr);
  virutal void SaySomething();
  };

Und der Unterschied?

C++:
Student myStudent("Martin", 1234);
Person& p = myStudent;

cout << p.SaySomething() << std::endl;

Wurde die Funktion hier versteckt dann wird hier Person::SaySomething aufgerufen.
Wurde die Funktion überschrieben wird hier Student::SaySomething aufgerufen.
 
Zuletzt bearbeitet von einem Moderator:
Zurück