2010-12-28 7 views
5

jest to przykład wzięty z Effective C++ 3ED, to mówi, że jeśli static_cast jest używany w ten sposób, dolna część obiektu zostanie skopiowany , a połączenie jest wywoływane z tej części. Chciałem zrozumieć, co dzieje się pod maską, czy ktoś pomoże?Pytanie używając static_cast na „ten” wskaźnik w obiekcie pochodzącej z klasy bazowej

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

Chciałbym zauważyć że od 'static_cast (* this)' tworzy kopię, ten kod jest najprawdopodobniej ** NIE produkujący zamierzonego wyniku **. – gatopeich

Odpowiedz

11

to:

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

jest faktycznie taki sam jak ten:

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

Pierwsza linia tworzy kopię Window bazowej klasy podobiektu obiektu SpecialWindow wskazywanego przez this . Druga linia wywołuje onResize() na tej kopii.

Jest to ważne: użytkownik nigdy nie wywołuje Window::onResize() obiektu wskazanego przez this; dzwonisz pod numer Window::onResize() na utworzonej kopii this. Obiekt wskazany przez this nie zostanie dotknięty po wykonaniu kopii.

Jeśli chcesz zadzwonić Window::onResize() na obiekt wskazywany przez this, you can do so like this:

Window::onResize(); 
+1

Nie, to jest to samo, co 'Window w (* this);'. – curiousguy

5

Dlaczego odlewania? Wystarczy to zrobić, jeśli chcesz zadzwonić okna onResize()

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

porządku, można zrobić to samo, używając static_cast również, ale masz to zrobić w ten sposób,

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

Byłoby to prawdą, gdyby OP użył: 'static_cast ' (Zwróć uwagę na & tutaj i brak tego w powyższym przykładzie). –

+0

@Martin: dzięki za wskazanie tego. Zmodyfikowałem mój post. – Nawaz

+1

Co próbowałem powiedzieć. Czy twoja pierwsza wersja nie jest odpowiednikiem OP. Dzieje się tak dlatego, że wersja OP nie używa odwołania, a zatem tworzy kopię (* this) (za pomocą konstruktora kopiowania), a następnie wywołuje onResize() na kopii (nie na bieżącym obiekcie). –

Powiązane problemy