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

时间:2010-12-28 04:34:47

标签: 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
};

2 个答案:

答案 0 :(得分:11)

此:

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()指向的对象上调用thisyou can do so like this

Window::onResize();

答案 1 :(得分:5)

为什么要施法?如果你想调用Window的onResize(),

,就这样做
Window::onResize(); //self-explanatory!

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

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