Explizierter Aufruf einer Funktion ohne Beachtung der VTable
-
Code Beispiel:
struct A { virtual void func() { cout << "A" << endl; } }; struct B : public A { virtual void func() { A::func(); cout << "B" << endl; } }; void invoke_func(A& a) { a.func(); // <= soll A ausgeben und nicht A\nB } int main(int argv, char* args) { B b; invoke_func(b); }Mir fällt ehrlich gesagt kein Beispiel ein, wieso man das brauchen könnte. Da es aber nur eine reine Compilersache ist, wüsste ich auch nicht, wieso das nicht gehen sollte. Wie mach ich das?
-
a.A::func();
-
Mr.Long schrieb:
Mir fällt ehrlich gesagt kein Beispiel ein, wieso man das brauchen könnte.
???
Standardanwendungscase für virtuelle Funktionen?
-
Nathan schrieb:
Mr.Long schrieb:
Mir fällt ehrlich gesagt kein Beispiel ein, wieso man das brauchen könnte.
???
Standardanwendungscase für virtuelle Funktionen?Ich denke, die richtige Antwort lautet: Ja?

Ist nur igendwie komisch wenn man es noch nie gebraucht hat und dann nach dem Syntax sucht

Danke.
-
Nathan schrieb:
Mr.Long schrieb:
Mir fällt ehrlich gesagt kein Beispiel ein, wieso man das brauchen könnte.
???
Standardanwendungscase für virtuelle Funktionen?Huch???
Den "Standardanwendungscase" zeigt der OP selbst schon:struct B : public A { virtual void func() { A::func(); cout << "B" << endl; } };Ergo hat er das nicht gemeint, sondern wirklich den Fall dass man die Funktion non-virtual auf 'was anderes als
*thisaufrufen will.Und das ist nun wirklich kein Standardfall. Hab' ich noch genau *nie* gebraucht. Würde ich auch als hochkarätigen Code-Smell einstufen.
EDIT: Verdammte Tippfehler
-
Nein, das kommt schon oft vor:
void THE_REMOTE_FILE::purgeItem( void ) { THE_ITEM::purgeItem(); // <- rufe version der Basisklasse auf PTR_REMOTE_FOLDER parent( getParent() ); if( !parent->isRootPurging() ) { try { DocManService *theService = getService(); theService->sDeleteItem( remoteData.id ); } catch( SoapRequest::SoapException &e ) { STRING errText = e.faultString; if( !e.faultDetail.isEmpty() ) { errText += ": "; errText += e.faultDetail; } /*@*/ throw EDatabaseError( (const char *)errText ); } catch( GLIB_ERROR_CODE &errCode ) { const char *cp = getLibraryErrorText( errCode ); if( !cp ) cp = "Unkown Library Error"; /*@*/ throw Exception( cp ); } #if 0 catch( ... ) { /*@*/ throw; } #endif } }mfg Martin
-
Du musst schon lesen was ich schreibe.
ich schrieb:
Ergo hat er das nicht gemeint, sondern wirklich den Fall dass man die Funktion non-virtual *auf 'was anderes als this aufrufen will.
Und was ist nun wirklich kein Standardfall. Hab' ich noch genau *nie* gebraucht. Würde ich auch als hochkarätigen Code-Smell einstufen.
-
hustbaer schrieb:
Du musst schon lesen was ich schreibe.
ich schrieb:
Ergo hat er das nicht gemeint, sondern wirklich den Fall dass man die Funktion non-virtual *auf 'was anderes als this aufrufen will.
Und was ist nun wirklich kein Standardfall. Hab' ich noch genau *nie* gebraucht. Würde ich auch als hochkarätigen Code-Smell einstufen.
Du hast recht. Hab ich überlesen.
mfg Martin
-
mgaeckler schrieb:
Nein, das kommt schon oft vor:
void THE_REMOTE_FILE::purgeItem( void ) { THE_ITEM::purgeItem(); // <- rufe version der Basisklasse auf PTR_REMOTE_FOLDER parent( getParent() ); if( !parent->isRootPurging() ) { try { DocManService *theService = getService(); theService->sDeleteItem( remoteData.id ); } catch( SoapRequest::SoapException &e ) { STRING errText = e.faultString; if( !e.faultDetail.isEmpty() ) { errText += ": "; errText += e.faultDetail; } /*@*/ throw EDatabaseError( (const char *)errText ); } catch( GLIB_ERROR_CODE &errCode ) { const char *cp = getLibraryErrorText( errCode ); if( !cp ) cp = "Unkown Library Error"; /*@*/ throw Exception( cp ); } #if 0 catch( ... ) { /*@*/ throw; } #endif } }mfg Martin
*lach*
Erstmal mit (void) anfangen, damit klar ist, welche Bücher Du liest.Abgesehen davon haste doch auch nur den Standardfall beschrieben. Klar, daß eine Klassenmethode die passende Basisklassenmethode aufruft, ist ganz normal. Aber daß ein Fremder, vielleicht die main() das macht, das stinkt zum Himmel.
-
hustbaer schrieb:
Nathan schrieb:
Mr.Long schrieb:
Mir fällt ehrlich gesagt kein Beispiel ein, wieso man das brauchen könnte.
???
Standardanwendungscase für virtuelle Funktionen?Huch???
[...]Missverständnis meinerseits. Expliziter Aufruf ist natürlich nicht Standardfall.
Ich dachte sein:Mir fällt ehrlich gesagt kein Beispiel ein, wieso man das brauchen könnte.
bezieht sich auf
soll A ausgeben und nicht A\nB
, weswegen ich verwirrt reagierte, denn virtueller Aufruf via Referenz ist jetzt der Standardanwendungsfall für virtuelle Funktionen.
Dass es sich auf den expliziten Aufruf bezieht, auf die Idee kam ich nicht.