Fragen zum Polymorphismus und Instanzen
-
Hallo!
Ich lese gerade ein Buch aber dort sind einige Sachen nicht gut erklärt, es wäre nett wenn mir jemand kurz erkläre könnte was jetzt genau Polymorphismus ist, evt. mit einem Beispiel.
Außerdem steht im Buch diese Wichtige Regel:
[qoute]**
Nicht-virtuelle Funktionen einer Basisklasse sollen nicht in abgeleiteten Klassen überschrieben werden!**[/quote]Warum nicht? Daraus ergibt sich nämlich ein anderes Problem für mich, nehmen wir mal dieses Szenario an:
class CFlugobjekt { public void Set_Data(unsigned int); private: unsigned int m_maxflughoehe; }; void CFlugobjekt::Set_Data(unsigned int flughoehe) { m_maxflughoehe = flughoehe; } // Nun wird geerbt! class CFlugzeug : public CFlugobjekt { public: /*hier will ich die geerbte Methode "Set_Data" verändern, also so ändern das sie den Flugzeugtyp auch noch als string aufnehmen kann, wie geht das ohne sie neu zu schreiben*/ private: string m_typ; };
Falls im Code Fehler sind - sorry habs eben nur so als bsp getippt.
Vielen Dank!
-
lilastift schrieb:
Nicht-virtuelle Funktionen einer Basisklasse sollen nicht in abgeleiteten Klassen überschrieben werden![/b]
Warum nicht? Daraus ergibt sich nämlich ein anderes Problem für mich, nehmen wir mal dieses Szenario an:
Weil sie verdeckt werden.
class B { public: void print() const { cout<<"I'm a B\n"; } }; class D : public B { public: void print() const { cout<<"I'm a D\n"; } }; void f(Base const& b { b.print(); } int main() { B b; D d; d.print(); b.print(); f(b); f(d); //BUMM }
set_Data ist keine gute Methode.
Numm set_XXX für jeden Datensatz einzeln.
als set_Height, set_Name, set_WhateverDenn was wenn ich nur den Namen ändern will, aber die Flügelspannweite soll gleich bleiben?
-
Aber was ist nun Polymorphismus? Und ist es möglich wenn ich eine Funktion habe diese in einer Distanz zu verändert, sprich etwas hinzuzufügen?
-
lilastift schrieb:
Aber was ist nun Polymorphismus? Und ist es möglich wenn ich eine Funktion habe diese in einer Distanz zu verändert, sprich etwas hinzuzufügen?
Polymorphie bedeutet, dass das Verhalten eines Objektes vom Typ abhängt.
Mittels virtual kannst du eine virtuelle Methode erstellen - diese läst sich in abgeleiteten Klassen 'verändern', sprich selber (und somit auch anders) zu implementieren, als in der Basisklasse.
-
Sehe ich das dann richtig das bei einer Instanz wo ich eine Methode der Basisklasse einfach erneut definiere die alte gar nicht überschrieben, sondern nur einfach nicht genutzt wird?
-
Nicht-virtuelle Funktionen einer Basisklasse sollen nicht in abgeleiteten Klassen überschrieben werden!
Und vrituelle Funktionene sollen entweder alle oder keine ueberschreiben werden.
-
/edit: bezieht sich noch auf lilastifts Antwort.
Wie man's nimmt. Probier das Beispiel mal durch. Dann wirst du vermutlich verstehen, was wann passiert:
class Basis { void foo () { cout << "Basis\n"; } virtual void bar () { cout << "Basis\n"; } }; class Ableitung : public Basis { void foo () { cout << "Ableitung\n"; } void bar () { cout << "Ableitung\n"; } }; int main () { Basis basis; Ableitung ableitung; Basis * basiszeiger1 = new Basis; Basis * basiszeiger2 = new Basis; basis.foo (); baleitung.foo (); basiszeiger1->foo(); basiszeiger2->foo(); basis.bar (); baleitung.bar (); basiszeiger1->bar(); basiszeiger2->bar(); delete basiszeiger1; delete basiszeiger2; }
/edit:
Und vrituelle Funktionene sollen entweder alle oder keine ueberschreiben werden.
Quatsch!
-
Und vrituelle Funktionene sollen entweder alle oder keine ueberschreiben werden.
Quatsch!
Ich meine die Fuktionene mit derselben Name. z.B:
struct A { virtual void f(int k){;}; virtual void f(){;}; }; struct B: public A { virtual void f(int j){;} }; int main (int argc, char * argv[]) { B t; t.f(); // Fehler!!! }
Das geht nicht!!
-
Ach so, ja oder per using in den eigenen Scope holen.
struct A { virtual void f(int k){;}; virtual void f(){;}; }; struct B: public A { virtual void f(int j){;} using A::f; }; int main (int argc, char * argv[]) { B t; t.f(); // Geht wunderbar!!! }
-
> Ach so, ja oder per using in den eigenen Scope holen.
Natuerlich