C++ Interface->Basisiklasse->Ableitungsklasse

Gast #4631202
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?
(Firma: Torrox.de) #4631392
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.
Gast #4631440
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??
Gast #4631457
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).
#4631575
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?
Gast #4631868
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.
Gast #4632360
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...
(Firma: Torrox.de) #4632541
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 ;-)
Gast #4632860
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...
#4634529
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren