Вопрос об использовании static_cast для указателя "this" в производном объекте для базового класса - PullRequest
5 голосов
/ 28 декабря 2010

это пример, взятый из Effective C ++ 3ed , он говорит, что, если static_cast используется таким образом, базовая часть объекта копируется, и вызов вызывается из этой части.Я хотел понять, что происходит под капотом, кто-нибудь поможет?

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 ]

11 голосов
/ 28 декабря 2010

This:

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

фактически такой же, как этот:

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

В первой строке создается копия подобъекта базового класса Window объекта SpecialWindowна что указывает this.Вторая строка вызывает onResize() для этой копии.

Это важно: вы никогда не вызываете Window::onResize() для объекта, на который указывает this;Вы звоните Window::onResize() на копию this, которую вы создали.Объект, на который указывает this, не будет затронут после того, как вы скопируете его.

Если вы хотите вызвать Window::onResize() для объекта, на который указывает this, , вы можете сделать это следующим образомэто :

Window::onResize();
5 голосов
/ 28 декабря 2010

Почему кастинг?Просто сделайте это, если вы хотите вызвать onResize () Window,

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

Хорошо, вы можете сделать то же самое, используя static_cast, но вы должны сделать это так,

   static_cast<Window&>(*this).onResize();
    //note '&' here  ^^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...