Forum: PC-Programmierung C++ Interface->Basisiklasse->Ableitungsklasse


von Durchstarter (Gast)


Lesenswert?

Hallo Forum,

ich schätze, ich habe ein "Verbrechen" mit folgendem Szenario begangen:

- Interface "I_step" definiert
- Eine Basisklasse "Baseclass" erstellt und dort Methoden implementiert, 
die ich in jeder späteren Instanz auf jeden Fall haben möchte
- Einige abgeleitete Klassen erstellt, die von Baseclass erben.

Das vermutliche Verbrechen: im Inetrface gibt es eine Funktion, die in 
der Basisklasse aufgerufen wird, aber erst in den abgeleiteten Klassen 
definiert wird, da zwar der Zeitpunkt des AUfrufs im Programablauf 
gleich sein soll, aber das auszuführende unterschiedlich.

Habe ich da Murks gebaut?

von Jay (Gast)


Lesenswert?

Nein.

von Warpkernauswerfer (Gast)


Lesenswert?

https://de.wikipedia.org/wiki/Schablonenmethode
Dein Interface ändert nichts am Prinzip.

von Sebastian V. (sebi_s)


Lesenswert?

Wenn die Basisklasse nicht alle Funktionen vom Interface implementiert 
kann man zwar kein Objekt dieser Klasse erstellen, aber ich denke das 
ist dir schon aufgefallen. Ansonsten ist das schon in Ordnung.

von Mark B. (markbrandis)


Lesenswert?

Sebastian V. schrieb:
> Wenn die Basisklasse nicht alle Funktionen vom Interface implementiert
> kann man zwar kein Objekt dieser Klasse erstellen, aber ich denke das
> ist dir schon aufgefallen. Ansonsten ist das schon in Ordnung.

Dann müsste diese Basisklasse eine rein virtuelle Methode enthalten und 
wäre demnach eine abstrakte Basisklasse. Richtig?

: Bearbeitet durch User
von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Durchstarter schrieb:
> Das vermutliche Verbrechen: im Inetrface gibt es eine Funktion, die in
> der Basisklasse aufgerufen wird, aber erst in den abgeleiteten Klassen
> definiert wird, da zwar der Zeitpunkt des AUfrufs im Programablauf
> gleich sein soll, aber das auszuführende unterschiedlich.


Bis auf die Namen ist dass alles ok. Das Muster (Pattern) hat sogar 
einen Namen: Strategy Pattern.

von Durchstarter (Gast)


Lesenswert?

:-)
Auf der einen Seite bin ich erleichtert, dass die einhellige Meinung 
positiv ist.
Auf der anderen Seite, hatte ich das Gegenteil gehofft, weil sich 
beschriebene Methode manchmal merkwürdig verhält.

@Mark,
ja genau, die Basisklasse ist nicht instanziierbar.

Manchmal mehrt sich bei mir der Verdacht, dass man mehr oder weniger 
automatisch in Pattern programmiert, wenn man sich vorher ein paar 
strukturelle Überlegungen macht??

von Warpkernauswerfer (Gast)


Lesenswert?

Torsten R. schrieb:
> Das Muster (Pattern) hat sogar einen Namen: Strategy Pattern.

Da die entsprechende(n) Methode(n) in der Basisklasse aufgerufen werden, 
bleibe ich bei "Template Method Pattern" oder Schablonenmethode.

von Warpkernauswerfer (Gast)


Lesenswert?

Durchstarter schrieb:
> Manchmal mehrt sich bei mir der Verdacht, dass man mehr oder weniger
> automatisch in Pattern programmiert, wenn man sich vorher ein paar
> strukturelle Überlegungen macht??

Ja, und genau das ist die "gute" Vorgehensweise (im Gegensatz zu: Ich 
habe hier einen Katalog von 100 Entwurfsmustern; wie verwende ich jetzt 
bloß möglichst viele davon).

von Dumdi D. (dumdidum)


Lesenswert?

Bei virtuellen Funktionen nicht den virtuellen Destruktor vergessen.

von Georg B. (diereinegier)


Lesenswert?

In diesem Szenario kann man sich aber schon in den Fuß schießen:
einfach in einem Konstruktor der Basisklasse eine virtuelle Methode 
aufrufen, die erst in der abgeleiteten Klasse implementiert wird.

Aber in einer hohen Warnstufe sollte mittlerweile jeder Compiler davor 
warnen.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Warpkernauswerfer schrieb:
> Torsten R. schrieb:
>> Das Muster (Pattern) hat sogar einen Namen: Strategy Pattern.
>
> Da die entsprechende(n) Methode(n) in der Basisklasse aufgerufen werden,
> bleibe ich bei "Template Method Pattern" oder Schablonenmethode.

Ja, Du hast Recht! :-)

von Durchstarter (Gast)


Lesenswert?

@ Georg
Ein "Foot-Shoot-Pattern" also ;-)

von Vlad T. (vlad_tepesch)


Lesenswert?

Georg B. schrieb:
> In diesem Szenario kann man sich aber schon in den Fuß schießen:
> einfach in einem Konstruktor der Basisklasse eine virtuelle Methode
> aufrufen, die erst in der abgeleiteten Klasse implementiert wird.
>

Ist das wirklich so?

Klar der Konstruktor der Ableitungen wurde noch nicht aufgerufen, aber 
die V-Table sollte schon korrekt gesetzt sein (möglicherweise auch die 
initializer lists schon abgearbeitet), oder?

von tictactoe (Gast)


Lesenswert?

Vlad T. schrieb:
> Georg B. schrieb:
>> In diesem Szenario kann man sich aber schon in den Fuß schießen:
>> einfach in einem Konstruktor der Basisklasse eine virtuelle Methode
>> aufrufen, die erst in der abgeleiteten Klasse implementiert wird.
>>
>
> Ist das wirklich so?

Ja. Eine Instanz einer Klasse C "ist-ein" C erst, wenn der Konstruktor 
von C fertig ist, nicht vorher. Wenn eine Klasse D von C abgeleitet ist, 
kann der Konstruktor von C keine Methoden von D aufrufen (auch keine 
virtuellen), weil zu diesem Zeitpunkt die Instanz noch nicht "ist-ein" 
D.

Vlad T. schrieb:
> Klar der Konstruktor der Ableitungen wurde noch nicht aufgerufen, aber
> die V-Table sollte schon korrekt gesetzt sein (möglicherweise auch die
> initializer lists schon abgearbeitet), oder?

Die V-Table ist zum Zeitpunkt, zu dem der Konstruktor von B abläuft, 
noch nicht auf D gesetzt. Auch die Initializer-List von D ist noch nicht 
abgearbeitet.

von Kal Auer (Gast)


Angehängte Dateien:

Lesenswert?

...

von Eric B. (beric)


Lesenswert?

Durchstarter schrieb:
> Auf der anderen Seite, hatte ich das Gegenteil gehofft, weil sich
> beschriebene Methode manchmal merkwürdig verhält.

Je mehr du über dieses merkwürdiges Verhalten erzählst, desto größer ist 
die Chance dass jemand dir damit helfen kann.

von Durchstarter (Gast)


Lesenswert?

Tja, mit einem klarem Kopf am morgen sieht man mehr:

qDebug() << "Bla bla String" + integerMessert;
>so gehts dann magischer weise doch:
qDebug() << "Bla bla String" + QString::number(messWert);

kaum macht man´s richtig, schon funktioniert´s. Immer wieder 
erstaunlich...

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Durchstarter schrieb:
> Tja, mit einem klarem Kopf am morgen sieht man mehr:
>
> qDebug() << "Bla bla String" + integerMessert;
>>so gehts dann magischer weise doch:
> qDebug() << "Bla bla String" + QString::number(messWert);
>
> kaum macht man´s richtig, schon funktioniert´s. Immer wieder
> erstaunlich...

Ich bin jetzt nicht so vertraut mit qt, aber
1
qDebug() << "Bla bla String" << integerMessert;

sollte bestimmt auch gehen und sieht irgend wie "vertrauter" aus ;-)

von Durchstarter (Gast)


Lesenswert?

Hoppla, war nicht qDebug() sondern

myCursor->insertText("Bla bla String" + QString::number(wert));

Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...

von Rolf M. (rmagnus)


Lesenswert?

Vlad T. schrieb:
> Klar der Konstruktor der Ableitungen wurde noch nicht aufgerufen, aber
> die V-Table sollte schon korrekt gesetzt sein (möglicherweise auch die
> initializer lists schon abgearbeitet), oder?

Nein. Erst wenn der Konstruktor der abgeleiteten Klasse vollständig 
ausgeführt wurde, kann man davon ausgehen, dass der entsprechende Teil 
des Objekts auch vollständig initialisiert ist. Deshalb gilt das Objekt 
auch erst ab dem Zeitpunkt als Instanz dieser Klasse.

von Bernd K. (prof7bit)


Lesenswert?

Kal Auer schrieb:
> [virtual.gif]

Da lob ich mir Pascal, da dürfen sogar Konstruktoren virtuell sein :-)

von Rolf M. (rmagnus)


Lesenswert?

Bernd K. schrieb:
> Kal Auer schrieb:
>> [virtual.gif]
>
> Da lob ich mir Pascal, da dürfen sogar Konstruktoren virtuell sein :-)

Was da in diesem Bild steht, stimmt aber nicht. Virtulle 
Memberfunktionen funktionieren auch in Kontruktoren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.