Basisklassen und Subklassen
-
class Base { int m_x; int m_y; }; class Sub : public Base { int m_z; };Es heißt ja "Jedes Sub ist ein Base". Also die >ist ein< Beziehung.
Aber wenn ich sowas jetzt mache
void foo1 (const Base&);Und die Funktion so aufrufe
Sub SubObj; // SubObj füllen foo1(SubObj); // Funktioniert!?!Wieso funktioniert das? Hier wird ein Base-Objekt erwartet welches nicht verändert werden darf. Dass das funktioniert ist mir klar, wegen der Ist-Ein-Beziehung, aber ich verliere doch mein m_z !
Hoffe dass ich das Problem richtig schildern konnte und mir jemand erklären könnte wieso das so funktioniert?
-
Du verlierst m_z nicht, du kannst nur innerhalb der Funktion nicht auf m_z zugreifen. Und bei richtigem Design sollte das auch nicht notwendig sein (wenn du m_z brauchst, dann sollte der Parametertyp Sub und nicht Base sein).
-
Janjan schrieb:
Du verlierst m_z nicht, du kannst nur innerhalb der Funktion nicht auf m_z zugreifen. Und bei richtigem Design sollte das auch nicht notwendig sein (wenn du m_z brauchst, dann sollte der Parametertyp Sub und nicht Base sein).
Oder man benutzt Polymorphie...
-
Du verlierst dein m_z, aber wenn du es in der Funktion wirklich brauchst solltest du entweder zwei Funbktionen anbieten (eine für Base, eine für Sub), oder m_z gleich in die Basis ziehen.
Polymorphie wird auch erst richtig interessant, wenn du mit virtuellen Funktionen arbeitest.Ansonsten hast du die Möglichkeit, per dynamic_cast die Referenz auf Base in eine Referenz auf Sub zu casten (fange aber std::bad_cast auf!), dann kommst du auch wieder an dein m_z ran. Das sollte aber nur die Ausnahme sein, und kein dauerhafter "Hack".
-
void foo1 (const Base&);bedeuted, dass die Funktion foo1 keine nicht konstanten Methoden von
Baseaufrufen kann. Die Funktion darf das Objekt also nicht verändern.
Ansonsten verstehe ich nicht wirklich was Deine Frage ist. Dass man der Funktion einSubObjekt übergeben kann ist ja ganz normal und der Sinn von Polymorphie. Das hat aber nichts mitconstzu tun.