Когда (это! = это) в C++?

У меня есть очень странный вопрос.

У меня есть класс/функция:

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", "это" - 0x06cf2370.

Кто-то может объяснить что же, спрашивается, продолжается?

[РЕДАКТИРОВАНИЕ:] Истинный вопрос: если я должен сохранить 'эту' внутреннюю часть 'setCallBack', как я могу проверить позже что 'menuBox == this'?

Большое спасибо в совете!

11
задан Bill Kotsias 29 June 2010 в 11:38
поделиться

2 ответа

Да, указатель this должен быть исправлен, чтобы обеспечить полиморфизм множественного наследования. В качестве приближения нулевого порядка можно считать, что экземпляр класса C, который наследуется от A и B, включает экземпляр A, за которым следует экземпляр B. Теперь, если у вас есть указатель на экземпляр C и вы преобразуете его в экземпляр B, указатель this должен быть другим, потому что экземпляр B расположен после экземпляра C в памяти. Более подробное обсуждение см. в этой статье.

Маленькая тестовая программа:

#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));
}
17
ответ дан 3 December 2019 в 06:45
поделиться

Для любого указателя на объект его значение будет отличаться в зависимости от того, к чему он был приведен.

В функции-члене MenuBox , this указывает на часть MenuBox рассматриваемого объекта.

Однако в setCallBack он приводится к указателю на часть объекта Receiver .

Другими словами, this всегда будет равняться this , но для любого указателя p static_cast (p) никогда не будет equal static_cast (p) .

1
ответ дан 3 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: