2010-06-29 35 views
11

我有一个很奇怪的问题。C++中何时(this!= this)?

我有一个类/功能:

class MCBSystem { 

    [...] 

    template <class Receiver> 
    void setCallBack(int i, Receiver* receiver, void(Receiver::*function)(void*)) { 
     iCallBacks.at(i) = new CallBack<Receiver>(receiver, function, this); 
    }; 
}; 

我继承它(乘)在另一大类:

class MenuBox : public OverlayBox, public HIDListener, public FANLib::MCBSystem { 
[...] 
}; 

现在,如果我称之为 “setCallBack” 功能:

 menuBox->setCallBack(MenuBox::CLICKED, this, &SubMain::widgetClicked); 

那么“menuBox”的值就是0x06cf22b8,但在“setCallBack”中,“this”是0x06cf2370。

有人可以解释究竟是怎么回事?

真正的问题是:如果我需要在'setCallBack'中存储'this',我怎么才能稍后检查'menuBox == this'?

非常感谢advace!

回答

17

是的,this指针必须打补丁以允许多重继承多态性。作为零阶近似,可以认为从AB继承的类C的实例包括A的实例,后面跟着B的实例。现在,如果您有指向C实例的指针并将其转换为B的实例,则指针this必须不同,因为B实例位于内存中的C实例之后。请参阅this paper进行深入讨论。

小测试程序:

#include <iostream> 

struct A { int i; }; 
struct B { int j; }; 
struct C: A, B { }; 

#define PRINT(expr) std::cout << #expr " = " << expr << std::endl 

int main() { 
    C* c = new C; 
    B* b = c; 
    PRINT(b); 
    PRINT(c); 
    PRINT(static_cast<B*>(c)); 
} 
+1

然后,我怎么能稍后检查那个menuBox ==这个(里面存储'setCallBack'..? – 2010-06-29 11:37:01

+4

我认为它应该工作,如果你把它们投给一个普通的基类 – Philipp 2010-06-29 11:37:49

+0

谢谢你所有的答复。通过这样做来解决它: (((FANLib :: MCBSystem *)menuBox)==这个,是的,它的工作! – 2010-06-29 11:44:40

1

鉴于任何指向对象的指针,它的价值会根据什么它转换为是不同的。

MenuBox的成员函数内,this指向该对象的MenuBox部分。

但是,在setCallBack中,它被转换为指向该对象的Receiver部分的指针。

换一种方式,this永远等于this,但对于任何指针pstatic_cast<MenuBox>(p)永远等于static_cast<Receiver>(p)