003
17.09.2008, 08:31 Uhr
ao
(Operator)
|
Zitat von dafduf: |
in dieser version hat nun die klasse "Pacco" das "farbe"-attribut nicht. wie kann ich nun auf das attribut "farbe" der abgeleiteten klassen "peter" und "paul" zugreifen?
|
Indem du für peter und paul eine weitere gemeinsame Basisklasse definierst, z.B. so:
C++: |
class FarbigePerson : public Person { string farbe; // und Getter und Setter dazu };
class Peter : public FarbigePerson { };
|
und dann per dynamic_cast testest, ob die Instanz hinter personen[i] eine FarbigePerson ist. Falls ja, kannst du den Farbe-Getter aufrufen, falls nicht, darfst du das nicht.
Um dynamic_cast verwenden zu können, musst du am Compiler RTTI-Erweiterungen (RunTime Type Information) einschalten.
Aber auch das ist schon grenzwertig. Der Sinn einer Basisklasse ist, dass man mit allen Ableitungen das machen kann, was man mit der Basisklasse machen kann. Es ist also paradox, einen Sack voll "Person"-Instanzen zu verwalten und dann jede einzelne zu prüfen, ob sie eine "Farbe"-Methode hat oder nicht.
Wenn du jetzt nur Bahnhof verstehst: Erst mal liegenlassen und weiter Grundlagen lernen.
Zitat: |
ziel ist es, das die abgeleiteten klassen unterschiedliche attribute haben, sonst macht es ja sowieso keinen sinn, abgeleitete klassen zu erzeugen, wenn sie alle gleich sind.
|
Eine Basisklasse führt man ein wegen der Gemeinsamkeiten, nicht wegen der Unterschiede.
Möglicherweise ist dein Beispiel etwas zu simpel, um die Auswirkungen zu sehen. Vielleicht machst du mal ein Design für geometrische Formen, z.B. Kreis, Dreieck, Rechteck. Die gemeinsame Basisklasse Figur könnte abstrakte Methoden Zeichnen(), Umfang() und Flaecheninhalt() enthalten, die von jeder Ausprägung überschrieben werden.
Diese Anwendung taugt sogar als Beispiel für das Factory-Pattern. Mit drei gegebenen Punkten sind sowohl Kreis als auch Dreieck als auch Rechteck eindeutig beschrieben, d.h. eine Fabrikmethode, die drei Punkte als Parameter nimmt, kann alle drei Figuren erzeugen. Dieser Post wurde am 17.09.2008 um 09:03 Uhr von ao editiert. |