2010-12-28 4 views
5

questo è un esempio preso da Effective C++ 3ed, si dice che se lo static_cast viene utilizzato in questo modo, viene copiata la parte di base dell'oggetto e la chiamata viene invocata da quella parte. Volevo capire cosa sta succedendo sotto il cofano, qualcuno aiuterà?Domanda sull'utilizzo di static_cast sul puntatore "this" in un oggetto derivato sulla classe base

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

vorrei rimarcare dato che 'static_cast (* this)' crea una copia, questo codice è molto probabile ** NON produce il risultato desiderato **. – gatopeich

risposta

11

Questo:

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

è effettivamente la stessa come questo:

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

La prima riga crea una copia della classe Window di base sottoggetto dell'oggetto SpecialWindow puntato da this . La seconda riga chiama onResize() su quella copia.

Questo è importante: non si chiama mai Window::onResize() sull'oggetto indicato da this; chiami Window::onResize() sulla copia di this che hai creato. L'oggetto indicato da this non viene toccato dopo averlo copiato.

Se si desidera chiamare Window::onResize() sull'oggetto puntato da this, you can do so like this:

Window::onResize(); 
+1

No, è lo stesso di 'Window w (* this);'. – curiousguy

5

Perché casting? Basta fare questo se si desidera chiamare onResize di Window(),

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

Va bene, si può fare lo stesso, utilizzando static_cast anche, ma hai a che fare in questo modo,

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

Questo sarebbe vero se l'OP avesse usato: 'static_cast ' (Notare il & qui e la mancanza di esso nell'esempio precedente). –

+0

@ Martin: grazie per avermelo segnalato. Ho modificato il mio post. – Nawaz

+1

Quello che stavo cercando di dire. La tua prima versione non era equivalente all'OP. Questo perché la versione OP non usa riferimenti e quindi crea una copia di (* this) (usando il costruttore di copie) quindi chiama onResize() sulla copia (non l'oggetto corrente). –