C++ Probleme mit der vererbung

konnichi

Lt. Junior Grade
Registriert
Aug. 2009
Beiträge
408
Hallo Leute,
kann ein Problem nicht lösen. Und zwar will ich, dass beide definierte Klassen von einander etwas erben. Das klappt leider nicht.

Code:
#include <iostream>
using namespace std;

class BasisRaumschiff : public Ladungsraumschiff
{
public: // da es public ist, können andere Klassen aus dieser Klasse bestimmte Funktionen *leihen*
	int farbe;
	int energie;
	BasisRaumschiff()
	{
		farbe = 1;
		energie = 500;
		cout << "Neues Raumschiff wurde erstellt!" << endl;
	}
	void starten()
	{
		cout << "Raumschiff startet" << endl;
	}
	void landen()
	{
		cout << "Raumschiff landet" << endl;
	}
};

class Ladungsraumschiff : public BasisRaumschiff // hiermit vererbt  Klasse Ladungsschiff paar Funktionen aus der Klasse BasisRaumschiff;
{
public:
	int ladung;
	int Maxbeladung;
	Ladungsraumschiff()
	{
		ladung = 80;
		Maxbeladung = 360;
		cout << "Neues Ladungsraumschiff wurde erstellt!" << endl;
	}
	void Laden()
	{
		cout << "Transportraumschiff wird beladen" << endl;
	}
	void Entladen()
	{
		cout << "Transportraumschiff entlaedt" << endl;
	}
	virtual void starten()
	{
		cout << "Transportraumschiff startet" << endl;
	}
	virtual void landen()
	{
		cout << "Transportraumschiff landet" << endl;
	}
};
int main()
{

	Ladungsraumschiff a1;
	a1.Laden();
	a1.starten();
	a1.landen();
	a1.Entladen();
	cout << endl;
	BasisRaumschiff a2;
	a2.Laden();
	a2.starten();
	a2.landen();
	a2.Entladen();

	system("Pause");
}

Der Fehler lautet:
Code:
Fehler	1	error C2504: 'Ladungsraumschiff': Basisklasse undefiniert	c:\users\konny\documents\visual studio 2013\projects\klassen_vererbung\klassen_vererbung\main.cpp	5	1	klassen_vererbung
Fehler	2	error C2039: 'Laden': Ist kein Element von 'BasisRaumschiff'	c:\users\konny\documents\visual studio 2013\projects\klassen_vererbung\klassen_vererbung\main.cpp	63	1	klassen_vererbung
Fehler	3	error C2039: 'Entladen': Ist kein Element von 'BasisRaumschiff'	c:\users\konny\documents\visual studio 2013\projects\klassen_vererbung\klassen_vererbung\main.cpp	66	1	klassen_vererbung

wenn ich die Zeilen:

a2.Entladen();
a2.Laden();
: public Ladungsraumschiff

entferne, läuft das Programm. Die Klasse Ladungsraumschiff erbt ohne Probleme die Sachen aus BasisRaumschiff. Aber warum will die BasisRaumschiff Klasse selbst nichts erben??
Bin für jede Hilfe dankbar :)
 
konnichi schrieb:
Hallo Leute,
kann ein Problem nicht lösen. Und zwar will ich, dass beide definierte Klassen von einander etwas erben. Das klappt leider nicht.

Erzeuge ein dritte Klasse, die jene Eigenschaften hat, welche beide Klassen haben sollen. Zirkuläre Vererbung ist nicht.
 
konnichi schrieb:
Die Klasse Ladungsraumschiff erbt ohne Probleme die Sachen aus BasisRaumschiff. Aber warum will die BasisRaumschiff Klasse selbst nichts erben?

ich denke, was Du willst, ist simple Einfachvererbung, also vielleicht sowas hier (dein Programm minimal modifiziert):
Code:
#include <iostream>
using namespace std;

// da es public ist, können andere Klassen aus dieser Klasse bestimmte Funktionen erben
 class BasisRaumschiff
{
 public:
   int farbe;
   int energie;
   BasisRaumschiff() {
      farbe = 1, energie = 500;
      cout << "Neues BasisRaumschiff wurde erstellt!" << endl;
   }
   ~BasisRaumschiff() { cout << "BasisRaumschiff wurde verschrottet" << endl; }
   void starten() { cout << "BasisRaumschiff startet" << endl; }
   void landen() { cout << "BasisRaumschiff landet" << endl; }
};

// hiermit erbt  Klasse Ladungsschiff paar Funktionen aus der Klasse BasisRaumschiff;
class Ladungsraumschiff : public BasisRaumschiff
{
public:
   int ladung;
   int Maxbeladung;
   Ladungsraumschiff() {
      ladung = 80, Maxbeladung = 360;
      cout << "Neues Ladungsraumschiff wurde aus BasisRaumschiff erstellt!" << endl;
   }
   ~Ladungsraumschiff() { cout << "Ladungsraumschiff wurde verschrottet" << endl; }
   void Laden() { cout << "Ladungsraumschiff wird beladen" << endl; }
   void Entladen() { cout << "Ladungsraumschiff entlaedt" << endl; }
};

 int main()
{
 {
    BasisRaumschiff BR;
    BR.starten();
    BR.landen();
 }
 cout << endl;
 {
    Ladungsraumschiff LR;
    LR.Laden();
    LR.starten();
    LR.landen();
    LR.Entladen();
 }
 cout << endl;
}

my € 0.02
 
Danke für schnelle Antworten.
Also, zum logischen Vorgehen. Die Basisklasse sollte alle Methoden enthalten, die ich eventuell brauchen würde? Damit die restlichen Raumschiffe sich entsprechende Methoden auch *leihen* könnten, richtig? Und die Basisclass kann also nichts erben? Weil sie alles bereits enthalten soll? habe ich das jetzt so richtig verstanden?
Zum Beispiel, jedes Raumschiff muss etwas abfeuern können, zur Selbstverteidigung. Die Abschussmethode müsste dann in der Basisklasse enthalten sein, damit alle anderen durch Erben darauf Zugriff hätten?
 
Ja genau das ist der Sinn von Vererbung.

Alle Raumschiffe können fliegen? Ab in die Basisklasse!
Einige Raumschiffe können schießen, andere nicht? Mach eine Klasse die von der Basisklasse erbt und leite alle Schiffe die schießen können dann von dieser ab etc.

Um das Problem der zirkulären Vererbung mal mit einem natürlichen Beispiel zu untersetzen. Du kriegst ein Kind das hat, cooler Weise weil die Evolution eingesehen hat das 2 zu wenig sein, einen 3. Arm ... kriegt dein Vater jetzt auch einen? ;)
 
Also, von "leihen" spricht man überhaupt nicht bei Vererbung.

Stell dir das "Vererben" wie ein "ist ein" vor. Also bei dir:
Die Klasse Ladungsraumschiff erbt von BasisRaumschiff -> Ein "Ladungsraumschiff" ist ein "BasisRaumschiff"
Aber umgekehrt gilt das nicht: Ein "BasisRaumschiff" ist kein "Ladungsraumschiff" -> Deshalb macht Vererbung keinen Sinn.

Ein anderer Gesichtspunkt: Die Basisklasse ist immer allgemeiner gehalten als die vererbten Klassen.
D.h. BasisRaumschiff enthält alle Funktionen, die JEDES Raumschiff hat. LadungsRaumschiff leitet davon ab und hat damit automatisch alle Methoden, die auch BasisRaumschiff hat. Darüber hinaus kannst du noch Methoden definieren, die NUR ein LadungsRaumschiff hat. Die sind dann NICHT in der Basisklasse enthalten.
 
Zurück
Oben