什么时候(这个!=这个)在C++中?

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继承自AB可以被认为包含一个实例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)

  • 我认为如果将它们转换为公共基类,它应该可行. (4认同)
  • 使用C++强制转换,例如`static_cast`. (3认同)
  • 一般来说,不要施放.转换是隐式的,比较是OK,或者模糊不清楚. (3认同)