Polymorphy
-
hallo
ich bin gerade in einem buch bei den Klassen. Genau genommen im unterthema "Polymorphy". speziel ging es zuletzt um die virtual deklaration von methoden. Ich dachte eigentlich ich hätte den sinn verstanden aber nach einem test mit einem C++ compiler meiner wahl, kommt ein anderes ergebniss heraus als ich erwartet hätte. Also grundsätzlich geht es ja bei polymorphy darum, wenn eine abgeleitete klasse eine identische methode der basis klasse ändern muss/möchte. richtig? z.b.
class Animal { public: virtual void Eat() { ShowMessage("Animal"); } }; class Cat : public Animal { public: virtual void Eat() { ShowMessage("CAT"); } }; Cat cat; cat.Eat(); //die ausgabe ist und sollte "CAT" sein.aber hier ohne polymorphy
class Animal { public: void Eat() { ShowMessage("Animal"); } }; class Cat : public Animal { public: void Eat() { ShowMessage("CAT"); } }; Cat cat; cat.Eat(); /*die ausgabe ist "CAT" sollte jedoch "Animal" sein, da ja die Eat methode von der Klasse animal geerbt wurde.*/jetzt bin ich etwas confuse...

-
Du hast ja dein Objekt nicht dynamisch erzeugt, da weiß der Compiler bereits zur Compile-Zeit welche Methode aufgerufen werden muss.
Late-Binding kommt bei folgendem Code zur ausführung:Animal* p = new Cat; p->Eat(); delete p;Gruß
-
Du hast die eat()-Methode in der Klasse Cat aber ja überschrieben. Und daher greift ein Cat-Objekt (in diesem Fall cat) dann auf diese Methode zu. (Ich hoffe ich erzähle jetzt keinen Quatsch
)
-
danke ihr habt beide recht. im buch stand es auch so mit dem dynamischen objekt erstellen und initialisierung mit der anderen klasse. habe es bei meinem test nur vergessen so zu übernehmen. eine frage noch:
Animal *animal = new Cat();hier wird ein zeiger auf die klasse Animal erzeugt. der zeiger wird mit der klasse Cat initialisiert. im speicher hat nun also der zeiger den inhalt eines Cat objektes, richtig? und eine weitere frage:
Cat *cat = new Animal();wieso geht sowas nicht? Ist genau das gleiche wie vorher nur eben umgekehrt. Liegt das daran das Animal die basisklasse ist und Cat eine abgeleitete klasse von Animal und somit beim ersten beispiel möglich und beim zweiten beispiel nicht, da eben Animal und nicht Cat die basis klasse ist?
-
Man kann nur Up-Casten. Down-Cast macht man mit dynamic_cast<>, der geht aber nur wenn das Obejkt wirklich von dem jeweiligen Typ ist. Du kannst also kein Animal in eine Cat verwandeln, aber eine Cat so behandeln als ob sie ein Animal wäre.
Gruß
-
Getreu dem Grundsatz eine Ableitung ist vom Typ Basisklasse: Das zweite Beispiel geht nicht, weil Cat "mehr" ist als Animal... Deshalb erfüllt ein Animal nicht alle Voraussetzungen (es hat weniger) um in einem Zeiger vom Typ Cat gespeichert zu werden. Umgekehrt jedoch ist jedes Cat auch ein Animal, deshalb geht das (ist ja auch der Sinn der Polymorphie).