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;
}
则有预期效果。