在派生对象中的“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&lt;Window&gt;(*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&lt;Window&amp;&gt;(请注意此处的 & 以及上面示例中缺少它)。 我想说什么。是不是你的第一个版本不等同于OP。这是因为 OP 版本不使用引用,因此创建 (*this) 的副本(使用复制构造函数)然后在副本(不是当前对象)上调用 onResize()。 你为什么使用参考文献? @Lexshard:这样static_cast 不会创建副本,在这种情况下,它会在立即销毁的复制对象上调用onResize(),而原始对象保持不变。希望对您有所帮助。

以上是关于在派生对象中的“this”指针上使用 static_cast 到基类的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有直接继承的情况下访问基类容器中的派生对象

通过指向base,static_cast,crtp,删除模板的指针派生的成员

静态(static)待补充

C++面向对象-static、const

static函数如何调用虚函数

java中this的用法?