Milhouse2k Geschrieben 31. Januar 2007 Geschrieben 31. Januar 2007 Hi Leute, ich habe als erste Programmiersprache Java gelernt und habe nun das Problem, einen Effekt von Java in C++ darzustellen. Explizit geht es um das "final" statement in Java. Wenn ich in Java eine Klassenmethode mit final deklariere, dann kann diese in der Vererbungsumgebung nicht mehr überschrieben werden. Wie kann ich den gleichen Effekt in C++ erreichen ??? Danke Zitieren
Klotzkopp Geschrieben 31. Januar 2007 Geschrieben 31. Januar 2007 So etwas gibt es in C++ nicht. Du kannst allerdings dadurch, dass du eine Methode nicht als virtual deklarierst, andeuten, dass sie nicht überschrieben werden soll. Zitieren
Milhouse2k Geschrieben 1. Februar 2007 Autor Geschrieben 1. Februar 2007 Ok Danke. Dann muss ich mir etwas anderes einfallen lassen. Zitieren
AndyDD Geschrieben 5. Februar 2007 Geschrieben 5. Februar 2007 So etwas gibt es in C++ nicht. Du kannst allerdings dadurch, dass du eine Methode nicht als virtual deklarierst, andeuten, dass sie nicht überschrieben werden soll. Und wie siehts mit protected und private aus? Nach der Vererbung kannst du das doch auch nicht überschreiben... Zitieren
Wodar Hospur Geschrieben 5. Februar 2007 Geschrieben 5. Februar 2007 Ich weiß nicht in wie weit das geht, habe es auch nicht ausprobiert aber: C++ In C++ sind Methoden normalerweise nicht überschreibbar, und sie werden auch nicht dynamisch polymorph aufgerufen. Eine Methode wird erst dann überschreibbar und dynamisch polymorph, wenn sie mit dem Schlüsselwort virtual bezeichnet wird. Damit sind Methoden automatisch für das Überschreiben gesperrt, wenn das Schlüsselwort virtual nicht angegeben wird. Damit lässt sich die beschriebene Schablonenmethode in C++ einfach umsetzen, indem die Methoden output, start und end nicht mit dem Schlüsselwort virtual markiert werden. für weitere Informationen -> Galileo Computing :: Praxisbuch Objektorientierung – 5.3 Die Vererbung der Implementierung Zitieren
Guybrush Threepwood Geschrieben 5. Februar 2007 Geschrieben 5. Februar 2007 Erm Leute könntet ihr euch vielleicht erstmal zu den Schlüsselwörtern informieren bevor ihr irgendwelche Theorien aufstellt? virtual hat nichts damit zu tun ob man in der abgeleiteten Klasse eine Funktion überladen kann oder nicht. Das geht, wie Klotzkopp schon gesagt hat, immer wenn man die Klasse entsprechend ableitet. Zitieren
Wodar Hospur Geschrieben 5. Februar 2007 Geschrieben 5. Februar 2007 vielleicht verstehst du wo der unterschied ist zwischen überladen und überschreiben! er möchte eine funktion überschreiben, aber DAS geht anscheinend unter C++ nur wenn diese funktion virtual gekennzeichnet ist, vorher ist sie geschützt. Zitieren
Guybrush Threepwood Geschrieben 5. Februar 2007 Geschrieben 5. Februar 2007 Nein das ist falsch. Du kannst in C++ eine Methode nicht davor schützen das sie überladen, überschrieben oder sonst was wird. Zitieren
Wodar Hospur Geschrieben 7. Februar 2007 Geschrieben 7. Februar 2007 So hab es jetzt mal aus Neugier nachgespielt. Im Grunde haben alle Recht ;D. Als Beispiel: Klasse Vater mit der Methode wert, diese liefert 10 zurück. Dann gibt es noch Klasse Sohn die auch die Methode wert implementiert, diese liefert 20 zurück. In einem Testprogramm wird die Methode wert jeweils einmal von einer jeweiligen Instanz aufgerufen. Das Ergebnis ist: Vater -> 10 Sohn -> 20 Aber wenn sohn zu vater gecastet wird, also die ableitungshierachie eine Stufe nach oben gegangen wird, gibt es ein anderes Ergebnis: Vater -> 10 Sohn -> 20 Sohn der zu Vater wird -> 10 Sprich es wird die geerbete Methode aufgerufen, egal was vorher vereinbart wurden ist. Wenn jetzt die Methode allerdings in Vater mit virtual gekennzeichnet wird: Vater -> 10 Sohn -> 20 Sohn der zu Vater wird -> 20 Denn jetzt wird wenn es sie gibt, die Implementierung der untergeordneten Klasse aufgerufen. Du kannst also Methoden nicht vor dem Überschreiben, Überladen mit einem Schlüsselwort schützen. Allerdings kannst du in dem Anwendungsprogramm durch ein explizites Casten immer sicher gehen was aufgerufen wird. Zitieren
Guybrush Threepwood Geschrieben 7. Februar 2007 Geschrieben 7. Februar 2007 Der Sinn von virtual liegt aber eher in genau der anderen Richtung. In folgendem Programm: #include <stdio.h> class A { public: A(){} void print() { printf ("A\n"); } }; class B : public A { public: B(){} void print() { printf ("B\n"); } }; class C : public A { public: C(){} void print() { printf ("C\n"); } }; int main() { A* a[3]; a[0] = new A(); a[1] = new B(); a[2] = new C(); for (int i=0; i<3; ++i) a[i]->print(); return 0; } [/PHP] bekommst du als Ausgabe A A A Markierst du print in Klasse A aber jetzt als virtual dann erhälst du A B C wie es normalerweise sein sollte. Ob man eine Funktion überschreiben/überladen kann ist aber wie wir uns ja jetzt einig sind unbetroffen. Zitieren
Wodar Hospur Geschrieben 8. Februar 2007 Geschrieben 8. Februar 2007 Du hast Recht der Sinn liegt eigentlich woanders, aber es kann für diesen Zweck umgebogen werden. Da ja die Impelmentierung der Oberklasse aufgerufen werden soll, reicht es die Unterklasse in die Oberklasse zucasten. Wenn die Funktion nicht virtuell ist wird jetzt immer die Implementierung der Oberklasse aufgerufen. Die Methode kann zwar logisch überschrieben werden, aber da ja die vorige Implementierung aufgerufen wird ist das egal. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.