2010-06-29 66 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)