将派生对象中的"this"指针的static_cast用于基类的问题

Joh*_*nyy 5 c++ inheritance virtual-functions

这是一个取自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
};
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 11

这个:

static_cast<Window>(*this).onResize();
Run Code Online (Sandbox Code Playgroud)

实际上与此相同:

{
    Window w = *this;
    w.onResize();
}   // w.~Window() is called to destroy 'w'
Run Code Online (Sandbox Code Playgroud)

第一行创建指向WindowSpecialWindow对象的基类子对象的副本this.第二行调用onResize()该副本.

这很重要:你永远不会打电话给Window::onResize()指向的对象this; 你打电话给你创建Window::onResize()的副本this.this复制后不会触及指向的对象.

如果要调用Window::onResize()指向的对象this,可以这样做:

Window::onResize();
Run Code Online (Sandbox Code Playgroud)


Naw*_*waz 5

为什么铸造?如果你想调用Window的onResize(),就这样做,

Window::onResize(); //self-explanatory!
Run Code Online (Sandbox Code Playgroud)

好吧,你也可以这样做,也使用static_cast,但你必须这样做,

   static_cast<Window&>(*this).onResize();
    //note '&' here  ^^
Run Code Online (Sandbox Code Playgroud)