在派生对象中的“this”指针上使用 static_cast 到基类的问题
Posted
技术标签:
【中文标题】在派生对象中的“this”指针上使用 static_cast 到基类的问题【英文标题】:Question of using static_cast on "this" pointer in a derived object to base class 【发布时间】:2010-12-28 04:34:47 【问题描述】:这是一个取自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
;
【问题讨论】:
我要说的是,由于static_cast<Window>(*this)
创建了一个副本,这段代码很可能没有产生预期的结果。
【参考方案1】:
这个:
static_cast<Window>(*this).onResize();
实际上与此相同:
Window w = *this;
w.onResize();
// w.~Window() is called to destroy 'w'
第一行创建this
指向的SpecialWindow
对象的Window
基类子对象的副本。第二行在该副本上调用onResize()
。
这很重要:你永远不会在this
指向的对象上调用Window::onResize()
;您在创建的 this
的副本上调用 Window::onResize()
。 this
所指向的对象在复制后不会被触及。
如果要在this
指向的对象上调用Window::onResize()
,you can do so like this:
Window::onResize();
【讨论】:
不,和Window w(*this);
一样。【参考方案2】:
为什么要选角?如果你想调用 Window 的 onResize() 就这样做吧,
Window::onResize(); //self-explanatory!
好吧,你也可以这样做,也可以使用 static_cast,但你必须这样做,
static_cast<Window&>(*this).onResize();
//note '&' here ^^
【讨论】:
如果 OP 使用的是:static_cast<Window&>
(请注意此处的 & 以及上面示例中缺少它)。
我想说什么。是不是你的第一个版本不等同于OP。这是因为 OP 版本不使用引用,因此创建 (*this) 的副本(使用复制构造函数)然后在副本(不是当前对象)上调用 onResize()。
你为什么使用参考文献?
@Lexshard:这样static_cast
不会创建副本,在这种情况下,它会在立即销毁的复制对象上调用onResize()
,而原始对象保持不变。希望对您有所帮助。以上是关于在派生对象中的“this”指针上使用 static_cast 到基类的问题的主要内容,如果未能解决你的问题,请参考以下文章