2010-12-28 10 views
5

este es un ejemplo tomado de Efectivo C++ 3ed, dice que si se usa el static_cast de esta manera, se copia la parte base del objeto , y la llamada se invoca desde esa parte. Quería entender qué está sucediendo bajo el capó, ¿alguien ayudará?Pregunta de usar static_cast en "este" puntero en un objeto derivado a la clase 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

Yo destacaría que dado que 'static_cast (* this)' crea una copia, es probable que este código ** NO produzca el resultado deseado **. – gatopeich

Respuesta

11

Este:

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

es efectivamente el mismo que esto:

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

La primera línea crea una copia del subobjeto clase Window base del objeto SpecialWindow apuntado por this . La segunda línea llama al onResize() en esa copia.

Esto es importante: nunca llama a Window::onResize() en el objeto señalado por this; llama al Window::onResize() en la copia de this que ha creado. El objeto apuntado por this no se toca después de realizar la copia.

Si desea llamar Window::onResize() en el objeto apuntado por this, you can do so like this:

Window::onResize(); 
+1

No, es lo mismo que 'Ventana w (* this);'. – curiousguy

5

Por qué casting? Acaba de hacer esto si desea llamar onResize de Ventana(),

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

Muy bien, usted puede hacer esto mismo, utilizando static_cast también, pero has de hacerlo de esta manera,

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

Eso sería cierto si el OP hubiera usado: 'static_cast ' (Observe el & aquí y la falta de él en el ejemplo anterior). –

+0

@Martin: gracias por señalar eso. Edité mi publicación. – Nawaz

+1

Lo que estaba tratando de decir. Fue su primera versión no es equivalente al OP. Esto se debe a que la versión OP no utiliza referencia y, por lo tanto, crea una copia de (* this) (utilizando el constructor de copia) y llama a OnResize() en la copia (no al objeto actual). –

Cuestiones relacionadas