У меня есть очень странный вопрос.
У меня есть класс/функция:
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'?
Большое спасибо в совете!
Да, указатель 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));
}
Для любого указателя на объект его значение будет отличаться в зависимости от того, к чему он был приведен.
В функции-члене MenuBox
, this
указывает на часть MenuBox
рассматриваемого объекта.
Однако в setCallBack
он приводится к указателю на часть объекта Receiver
.
Другими словами, this
всегда будет равняться this
, но для любого указателя p
static_cast
никогда не будет equal static_cast
.