2010-12-28 10 views
5

Dies ist ein Beispiel aus Wirksam C++ 3ed, heißt es, wenn die static_cast auf diese Weise verwendet wird, wird der Basisteil des Objekts kopiert und der Aufruf wird von diesem Teil aufgerufen. Ich wollte verstehen, was unter der Haube passiert, wird jemand helfen?Frage der Verwendung von static_cast auf "diesem" Zeiger in einem abgeleiteten Objekt zur Basisklasse

class Window {        // base class 
public: 
    virtual void onResize() { }     // base onResize impl 
}; 

class SpecialWindow: public Window {   // derived class 
public: 
    virtual void onResize() {     // derived onResize impl; 
    static_cast<Window>(*this).onResize(); // cast *this to Window, 
               // then call its onResize; 
               // this doesn't work! 
               // do SpecialWindow- 
    }           // specific stuff 
}; 
+2

würde ich bemerke dass seit 'static_cast (* this)' eine Kopie erstellt, wird dieser Code höchstwahrscheinlich ** NICHT das beabsichtigte Ergebnis ** erzeugen. – gatopeich

Antwort

11

Dieses:

static_cast<Window>(*this).onResize(); 

ist das Gleiche wie folgt aus:

{ 
    Window w = *this; 
    w.onResize(); 
} // w.~Window() is called to destroy 'w' 

Die erste Zeile erstellt eine Kopie der Window Basisklasse subobject des SpecialWindow Objekt, auf das durch this . Die zweite Zeile ruft onResize() auf dieser Kopie auf.

Dies ist wichtig: Sie rufen nie Window::onResize() auf das Objekt, auf das von this verwiesen wird; Sie rufen Window::onResize() auf der Kopie von this, die Sie erstellt haben. Das Objekt, auf das this zeigt, wird nicht berührt, nachdem Sie es kopiert haben.

Wenn Sie Window::onResize() auf das Objekt von this darauf rufen, you can do so like this:

Window::onResize(); 
+1

Nein, es ist dasselbe wie 'Window w (* this);'. – curiousguy

5

Warum Gießen? Genau dies tun, wenn Sie rufen die onResize Fenster wollen(),

Window::onResize(); //self-explanatory! 

In Ordnung, können Sie dies auch tun, indem static_cast auch, aber Sie haben auf diese Weise zu tun,

static_cast<Window&>(*this).onResize(); 
    //note '&' here ^^ 
+0

Das wäre wahr, wenn das OP verwendet hätte: 'static_cast ' (Beachten Sie das & hier und das Fehlen davon im obigen Beispiel). –

+0

@Martin: Vielen Dank für das darauf hinweisen. Ich habe meinen Beitrag bearbeitet. – Nawaz

+1

Was ich sagen wollte. War deine erste Version nicht gleichbedeutend mit dem OP? Dies liegt daran, dass die OP-Version keine Referenz verwendet und somit eine Kopie von (* this) erstellt (unter Verwendung des Kopierkonstruktors) und dann onResize() für die Kopie aufruft (nicht das aktuelle Objekt). –