Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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 ;)

Geschrieben
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...

Geschrieben

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

Geschrieben

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.

Geschrieben

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.

Geschrieben

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.

Geschrieben

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.

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...