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)
第一行创建指向Window的SpecialWindow对象的基类子对象的副本this.第二行调用onResize()该副本.
这很重要:你永远不会打电话给Window::onResize()指向的对象this; 你打电话给你创建Window::onResize()的副本this.this复制后不会触及指向的对象.
如果要调用Window::onResize()指向的对象this,可以这样做:
Window::onResize();
Run Code Online (Sandbox Code Playgroud)
为什么铸造?如果你想调用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)