Bil*_*ias 11 c++ this multiple-inheritance
我有一个非常奇怪的问题.
我有一个类/函数:
class MCBSystem {
[...]
template <class Receiver>
void setCallBack(int i, Receiver* receiver, void(Receiver::*function)(void*)) {
iCallBacks.at(i) = new CallBack<Receiver>(receiver, function, this);
};
};
Run Code Online (Sandbox Code Playgroud)
我在另一个类中继承它(乘法):
class MenuBox : public OverlayBox, public HIDListener, public FANLib::MCBSystem {
[...]
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我调用"setCallBack"函数:
menuBox->setCallBack(MenuBox::CLICKED, this, &SubMain::widgetClicked);
Run Code Online (Sandbox Code Playgroud)
然后"menuBox"的值为0x06cf22b8,但在"setCallBack"中,"this"为0x06cf2370.
有人可以解释一下究竟发生了什么吗?
[编辑:]真正的问题是:如果我需要在'setCallBack'中存储'this',我怎样才能检查'menuBox == this'?
非常感谢advace!
Phi*_*ipp 17
是的,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));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
572 次 |
| 最近记录: |