Vererbung und Casten

MRS

Mitglied
Hallo zusammen.
Ich bräuchte eure Hilfe, da ich irgendwie aufn Schlauch stehe.
Und zwar geht’s um Vererbung und das typische
....................-----> PKW
Fahrzeug -|
....................-----> LKW
Beispiel.
Dazu habe ich folgende Klassen:

class Fahrzeug
Code:
#define MAXZEICHEN 25

#include <iostream>
using namespace std;

class Fahrzeug
{
	protected:
		char name[MAXZEICHEN];
	
	public:
		// Konstruktor
		Fahrzeug(const char* neuer_name)
		{
			sprintf_s(name, MAXZEICHEN, neuer_name);
		};

		// Destruktor
		//~Medium()	{	};

		// Ein/Ausgabe
		virtual void ausgabe() = 0;
		//virtual void anzSitzplaetze(int neue_sitzplaetze) = 0;
		virtual void neuerName(const char* neuer_name) = 0;
};

class PKW
Code:
#include <iostream>
using namespace std;

class PKW : public Fahrzeug
{
	private:
		int sitzplaetze;

	public:
	// Konstruktor 
	PKW(const char* neuer_name, int neue_sitzplaetze)
	: Fahrzeug(const char* neuer_name)
	{
		sitzplaetze = neue_sitzplaetze;
	};

	// Destruktor
	//~PKW();

	// Ein/Ausgabe
	void ausgabe()
	{
		cout<<"PKW:"<<endl;
		cout<<"Name:   "<<name<<endl;
		cout<<"Sitze:  "<<sitzplaetze<<endl;
	};

	void anzSitzplaetze(int neue_sitzplaetze)
	{
		sitzplaetze = neue_sitzplaetze;
	};

	void neuerName(const char* neuer_name);
	{
		sprintf_s(name, MAXZEICHEN, neuer_name);
	};
};

class LKW
Code:
#include <iostream>
using namespace std;

class LKW : public Fahrzeug
{
	private:

	public:
		// Konstruktor
		LKW(const char* neuer_name)	: Fahrzeug(const char* neuer_name)	{};

		// Destruktor
		//~LKW();

		// Ein/Ausgabe
		void ausgabe()
		{
			cout<<"LKW:"<<endl;
			cout<<"Name:   "<<name<<endl;
		};

		void neuerName(const char* neuer_name);
		{
			sprintf_s(name, MAXZEICHEN, neuer_name);
		};
};

meine Main wo ich versuche von einer Klasse in die andere zu wandeln
Code:
	Fahzeug* fz[3];
		
	PKW* pkw1;	
	LKW* lkw1;

	fz[0] = new pkw1("Fiat", 5);
	fz[1] = new lkw1("MAN");

	cout<<"Dynamic-Cast Anwenden"<<endl;

	pkw1 = dynamic_cast<PKW*>(fz[0]);	// OK
	pkw1->ausgabe();
	cout<<endl<<endl;

	fz[2] = dynamic_cast<Fahzeug*>(fz[0]);	// OK
	fz[2]->ausgabe();
	cout<<endl<<endl;

	lkw1 = dynamic_cast<LKW*>(fz[0]); 	// Geht nicht
	lkw1->ausgabe();
	cout<<endl<<endl;

Mein Problem besteht darin, das ich es nicht schaffe aus einen PKW ein LKW zu machen (da er wie ich denke den Speicher für die Sitzplätze nicht reserviert hat).

Ich bin da ein wenig verwirrt.
Ich habe ja nur Daten vom Typ Fahrzeug… was mich zu einer weiteren Frage bringt.

Wie komme ich an die Funktion „void anzSitzplaetze(int neue_sitzplaetze)“ wenn ich doch ein Fahrzeug habe?

Des Weitereren: brauche ich die Destruktoren?

Das sind gleich 3 Wünsche auf einmal, also sag ich schon mal:
Vielen Dank für die Mühe sich das überhaupt an zu schauen :)

MFG Marco
 
Zuletzt bearbeitet:
Hi.
meine Main wo ich versuche von einer Klasse in die andere zu wandeln
Code:
	Fahzeug* fz[3];
		
	PKW* pkw1;	
	LKW* lkw1;

	fz[0] = new pkw1("Fiat", 5);
	fz[1] = new lkw1("MAN");
Das geht so nicht. Warum probierst du denn den Code nicht aus bevor du ihn postest?
C++:
fz[0] = new PKW("Fiat", 5);
	fz[1] = new LKW("MAN");
Code:
	fz[2] = dynamic_cast<Fahzeug*>(fz[0]);	// OK
Funktioniert natürlich, aber ist relativ sinnlos. Die Typen von fz[2] und fz[0] sind identisch. Kein Cast notwendig.

Code:
		fz[2]->ausgabe();
	cout<<endl<<endl;

	lkw1 = dynamic_cast<LKW*>(fz[0]); 	// Geht nicht
Natürlich geht das nicht. fz[0] ist ein PKW und kein LKW.
Mein Problem besteht darin, das ich es nicht schaffe aus einen PKW ein LKW zu machen.
Nur weil ein Elefant ein Tier ist und ein Rabe auch ein Tier, kann ein Elefant trotzdem keine Eier legen.
Ich bin da ein wenig verwirrt.
Das hättest du nicht dazusagen müssen.... ;)
Wie komme ich an die Funktion „void anzSitzplaetze(int neue_sitzplaetze)“ wenn ich doch ein Fahrzeug habe?
Warum hast du denn die rein virtuelle anSitzplaetze Methode in der Fahrzeug Klasse auskommentiert?

Ansonsten natürlich über einen Downcast mit dynamic_cast:
C++:
PKW* pkw = dynamic_cast<PKW*>(fz[0]);
if (pkw != 0) {
  pkw->anzSitzplaetze(...);
}
Des Weitereren: brauche ich die Destruktoren?
Nein.

Gruß
 
Zuletzt bearbeitet:
Hallo deepthroat.
Danke erst mal für die schnelle Antwort und Entschuldigung für den Fehler im Code. Ich hatte noch die ganze Zeit was probiert und nicht mehr kompiliert am Ende.
Hmmm… Dann dient der dynamic_cast nur zur Zurückumwandlung. Ach und ich sehe gerade das er NULL wird bei einem Fehlcast.
Da muss ich nochmal ran. Danke nochmals.

Die Aufgabe ist noch ein wenig größer und da werden mit Sicherheit noch ein zwei Fragen auftauchen. Daher schließe ich das Thema mal noch nicht.
MFG Marco
 
Zurück