Virtuelle Methoden und dynamisch Binden
-
Hallo Leute,
ich habe morgen eine Prüfung in Objektorientierter Programmierung, und habe leider noch ein paar Übungsaufgaben, welche ich nicht lösen kann...Hier die erste Aufgabe:
Welche Aussage erzeugt folgendes Programm?
Kennzeichne bei welchen Aufrufen von methode() dynamisch gebunden wird.class c1 { public: virtual void methode() { cout << "methode von c1 wird aufgerufen" << endl; }; }; class c2: public c1 {public: virtual void methode() { cout << "methode von c2 wird aufgerufen" << endl; }; }; class c3: public c1 { public: virtual void methode() { cout << "methode von c3 wird aufgerufen" << endl; }; }; int main() { c1 o_c1; c2 o_c2; c3 o_c3; c1*o_p1 = &o_c1; o_c1.methode(); o_c2.methode(); o_p1->methode(); o_p1 = &o_c3; o_p1->methode(); }Meine Lösung wäre Folgende: Also dynamisch gebunden wird in Zeile 31 und 34.
Da ich jedoch nicht weiß, ob beim dynamisch gebinden, die methode aufgerufen wird weiß ich auch nicht ob es dort Aufrufe geben wird.Deswegen sage ich einfach mal auf Verdacht, dass dies ausgegeben wird:
methode von c1 wurde aufgerufen
methode von c2 wurde aufgerufen
methode von c1 wurde aufgerufen
methode von c3 wurde aufgerufenIch bin jetzt davon ausgegangen, dass beim dynamisch binden auch ein Aufruf erzeug wird. Hoffe ihr könnt mir helfen, oder eines Besseres belehren!
Desweiteren wird noch gefragt, wie Objekte einer Klasse erzeugt werden können, wenn die Klasse ausschließlich private Konstruktoren besitzt.
Hinweis: Denke an Methoden und Member-Funktionen, die ohne ein Objekt aufgerufen werden können.Leider habe ich keine Ahnung, wie das geht! Wäre super, wenn ihr mir hier auch noch helfen könntet.
Danke im Voraus

-
Deswegen sage ich einfach mal auf Verdacht, dass dies ausgegeben wird:
Ja, korrekt.
Desweiteren wird noch gefragt, wie Objekte einer Klasse erzeugt werden können, wenn die Klasse ausschließlich private Konstruktoren besitzt.
Hinweis: Denke an Methoden und Member-Funktionen, die ohne ein Objekt aufgerufen werden können.Die Rede ist von Fabrikmethoden.
class A { A(){} public: static A create() { return {}; } };Für die statische Memberfunktion
createist der private Konstruktor natürlich zugänglich.Kopieren kann man das Objekt nach wie vor wie gewohnt.
-
Super, vielen Dank!
Hätte nicht gedacht, dass ich richtig liege
Dann hoffe ich mal, dass die Prüfung morgen zu bestehen ist..

mfG