cast

Effective C++上有如下代码:

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).onResize(); ”并不是调用当前对象上的函数,而是稍早转型动作所建立的一个“*this对象之base成分”的暂时副本身上onResize。于是想到,我不cast *this,我直接cast this总可以了吧,于是有了如下代码:

#include <iostream>
using namespace std;
class T
{
public:
 int x;
 virtual void SetX()
 {
  x = 10;
  cout<<"T::SetX x="<<x<<endl;
 }
};

class TT : public T
{
public:
 virtual void SetX()
 {
  static_cast<T*>(this)->SetX();
  x = 100;
  cout<<"TT::SetX x="<<x<<endl;
 }
};

int main()
{
 TT t;
 T *p = &t;
 p->SetX();
 return 0;
}

这段代码什么也不输出,为什么呢? static_cast<T*>(this)->SetX();,这里虽然把this转型到了积累,但是由于需虚函数的性质,调用的仍然是派生类的SetX函数,因而形成一个无限的递归,导致stack溢出。。。。。。

改为如下:
#include <iostream>
using namespace std;
class T
{
public:
 int x;
 void SetX()
 {
  x = 10;
  cout<<"T::SetX x="<<x<<endl;
 }
};

class TT : public T
{
public:
 void SetX()
 {
  static_cast<T*>(this)->SetX();//T::SetX();
  x = 100;
  cout<<"TT::SetX x="<<x<<endl;
 }
};

int main()
{
 TT t;
 t.SetX();
 return 0;
}

则有预期效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值