这是一个来自 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
};
答案 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()
指向的对象上调用this
,you can do so like this:
Window::onResize();
答案 1 :(得分:5)
为什么要施法?如果你想调用Window的onResize(),
,就这样做Window::onResize(); //self-explanatory!
好吧,你也可以这样做,也可以使用static_cast,但你必须这样做,
static_cast<Window&>(*this).onResize();
//note '&' here ^^