Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem: Vererbung / Zugriff auf Elemente abgeleiteter Objekte

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.09.2006, 14:12 Uhr
Steve06



Hallo,

bitte betrachtet folgenden Code, der beispielhaft für mein Problem ist.

Die Klassen Pkw und Lkw sind abgeleitet von Kfz. Um identifizieren zu können, um welche es sich handelt, hat jede Klasse ein String-Element, wo der Typ des Kfz gespeichert wird.
In der Basisklasse ist eine operator<<-Methode zur Ausgabe des Typs definiert.


C++:
class Kfz
{
    const string kfz_name;
    Kfz() : kfz_name("default") {}
    friend ostream& operator<< (ostream& os, const Kfz& K)
    {
     os<<  K.kfz_name;
         return os;
    }
}

class Pkw : public Kfz
{
    const string kfz_name;
    Pkw() : kfz_name("PKW") {}
}

class Lkw : public Kfz
{
    const string kfz_name;
    Lkw() : kfz_name("LKW") {}
}




Wenn ich nun irgendwo schreibe:

C++:
Pkw mein_pkw;
cout << mein_pkw;


wird "default" ausgegeben, also der String der Basisklasse und nicht der String der abgeleiteten Klasse Pkw ("PKW").

Ich könnte natürlich die Operator<<-Methode für jede der abgeleiteten Klassen redefinieren, dann würde es wohl klappen, aber das wäre doch nicht elegant .

Also ich würde es schätzen, wenn ihr mir eine Lösung zu diesem Problem anbieten könntet - ihr könnt euch entweder eng an meinem Code halten und so wenig wie möglich ändern, oder mir auch eine ganz andere Möglichkeit aufzeigen, die denselben Zweck erfüllt.

Cheers,
Steve
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.09.2006, 14:15 Uhr
Blubber2063



Naja du machst ja nen Grundsätzlichen Fehler, denn du hast jetzt in den geerbten Klassen zweimal den string. Mach mal den string in der Elternklasse protected und lass die Definitionen der strings als Member in den Kindklassen weg. Denke dann könnte es schon funktionieren.

Ach ja und alles was bei Class ohne Zugriffsrecht deklariert wird ist private, also mach mal den Konstruktor unter public.

Dieser Post wurde am 25.09.2006 um 14:20 Uhr von Blubber2063 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.09.2006, 14:17 Uhr
ao

(Operator)


Pkw::kfz_name und Lkw::kfz_name entfernen und Kfz::kfz_name protected machen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.09.2006, 14:43 Uhr
Steve06



Hallo,
natürlich sollte da public stehen. Ich habe das ausprobiert, ich hoffe ich habe Eure Vorschläge richtig übernommen:

C++:
class Kfz
{
protected:
    const string kfz_name;
public:
    Kfz() : kfz_name("default") {}
    friend ostream& operator<< (ostream& os, const Kfz& K)
    {
     os<<  K.kfz_name;
         return os;
    }
}

class Pkw : public Kfz
{
public:
    Pkw() : kfz_name("PKW") {}
}

class Lkw : public Kfz
{
public:
    Lkw() : kfz_name("LKW") {}
}



Jetzt bekomme ich den Fehler
error C2614: 'Pkw' : illegal member initialization: 'kfz_name' is not a base or member

Also die Initialisierung durch die Initialisierungsliste des Konstruktors schlägt fehl, da er nicht auf kfz_name zugreifen kann, wenn die Definition in derabgeleiteten Klasse weggelassen wird. Zuweisung im Konstruktor ist jedoch keine Alternative, da der String eine Konstante ist.

Dieser Post wurde am 25.09.2006 um 14:44 Uhr von Steve06 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.09.2006, 14:49 Uhr
Blubber2063



Hmm, kann sein das du explicit die Elternklasse nutzen musst. Also statt kfz:name("bla")
Kfz::kfz_name("bla")
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.09.2006, 14:51 Uhr
ao

(Operator)


Ach ja. Dann so:

C++:
#include <string>
using namespace std;

class Kfz
{
protected:
    const string kfz_name;
    Kfz(const string & name) : kfz_name(name) {}

public:
    friend ostream& operator<< (ostream& os, const Kfz& K)
    {
     os<<  K.kfz_name;
         return os;
    }
};

class Pkw : public Kfz
{
public:
    Pkw() : Kfz("PKW") {}
};

class Lkw : public Kfz
{
public:
    Lkw() : Kfz("LKW") {}
};


Durch den protected-Konstruktor ist Kfz jetzt eine abstrakte Basisklasse, die nicht mehr direkt instanziert werden kann. Das ist sinnvoll, denn eine konkrete Fahrzeug-Instanz ist entweder Pkw oder Lkw, aber niemals nur Kfz.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.09.2006, 21:17 Uhr
Steve06



Das hat funktioniert! Respekt!

Vielen Dank für Eure Hilfe.

Grüße

Steve
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: