einbettung von klassen
-
Es geht um folgenden Quellcode:
include <iosteam> using namespace std; class Eins { public: void f() { cout << "Eins \n";} }; class Zwei : public Eins { public: void f() {cout << "Zwei \n";} }; int main() { Eins x; Zwei y; Eins* ptr= &x; ptr-> f() ptr = &y; ptr -> f(); }Die Aufgabe lautet: was wird auf den bildschirm ausgegeben und begründen sie das ergebnis.
ausgabe: eins
einsgut man erzeugt ein objekt der klasse eins und greift dann per pointer auf die funktion zurück. deshalb ist die erste ausgabe recht klar, wobei doch das objekt dafür vollkommen irrelevant ist, da die funktion doch vom typ void ist oder?
nun die zweite ausgabe. der pointer zeigt nun auf ein objekt der klasse y,
allerding ist der pointer vom typ eins und kann somit nicht auf die funktion vom typ zwei zugreifen, daher keine ausgabe. da im public bereich klasse eins ausgegeben wird, wird somit in gewisser weise auf funktion der klasse eins zugegriffen oder wie kann man das verstehen?wär cool wenn jemand helfen könnte.
-
Der Zeiger Eins * zeigt immer auf ein Objekt das vom Typ Eins oder zumindest von Eins abgeleitet ist. Da Zwei von Eins abgeleitet ist, kann Eins * auch auf ein Objekt vom Typ Zwei zeigen. Damit hat man aber auch nur Zugriff auf das, was Eins an Möglichkeiten bietet. Daher ist die Ausgabe in beiden Fällen auch "Eins", da die Funktion von Eins aufgerugen wird.
Anders würde das aussehen, wenn man die Funktion virtuell (virtual) machen würde.
-
Es wird zweimal "Eins" ausgegeben,
da den Compiler in deinem Fall nur der Typ des Zeigers interessiert.
Der zeigt auf Eins und damit wird auch dessen Methode aufgerufen.wenn du möchtest, dass die Methode der Kindklasse auch über einen Basisklassenzeiger aufgerufen werden kann, musst du die Methode virtuell machen.
Darauf basiert das Konzept der Polymorphie.Beispiel:
include <iosteam> using namespace std; class Eins { public: virtual void f() { cout << "Eins \n"; } }; class Zwei : public Eins { public: virtual void f() {cout << "Zwei \n"; } }; int main() { Eins x; Zwei y; Eins* ptr = &x; ptr->f() ptr = &y; ptr->f(); }
-
die 2. ausgabe ist doch aber nur eins, da die erste klasse in die zweite eingebettet ist oder? sonst müsste er nen fehler anzeigen
-
n00b123 schrieb:
die 2. ausgabe ist doch aber nur eins, da die erste klasse in die zweite eingebettet ist oder? sonst müsste er nen fehler anzeigen
Das nennt man nicht einbetten, sondern vererben. Die Klasse Zwei hat von der Klasse Eins geerbt, ja.
Es würde ohne Vererbung nicht funktionieren, da sich Zwei dann nicht in Eins umwandeln lassen würde. Genau.