C++将 self 传递给 self 神秘

标签 c++ pointers virtual self

你能帮帮我吗? 我正在将自己传递给它自己的纯虚函数。

n->dataCallback(handler, n, hangup);

其中 n 是我的类指针,dataCallback 是它自己的(纯)虚函数(我知道这没有意义,我只是想知道为什么会发生我在下面描述的情况)。

所以现在在声明中:

void MyClass::dataCallback(int handler, void *cbData, bool hangup) {
    MyClass *This = (MyClass*) cbData;
 ....
}

现在,当我在运行时将 This(上面的变量)与 this(对象的指针)进行比较时,我得到:

  1. 指针的值(对象的地址)不同。
  2. 检查成员变量(This->member)时,我发现它们有不同的值。 (正确的值在 this 中,而 This 包含一个未定义的(对我来说是随机的)值。请注意,在调用方,该值当然是正确的,因此它似乎在调用过程中神奇地发生了变化,并且没有其他代码介于两者之间。

这怎么可能?有什么想法吗?

我花了2个小时思考这个问题,也问过其他程序员没有结果。

最佳答案

如果您有多重继承,将指针强制转换为每个父类可能会改变指针地址。请考虑以下事项:

class A
{
public:
    int a;
};

class B
{
public:
    int b;
};

class C : public A, B
{
};

C 类的内部布局将包含两个整数ab。如果您将指针从 C* 转换为 A*,一切都很好。如果将其转换为 B*,则需要调整指针,因为 B 中的第一个元素必须是整数 b!

如果您在两种类型都为编译器所知的情况下进行强制转换,它将以您不可见的方式进行调整 - 它就可以正常工作。编译器知道正确的调整应该是什么。当您转换为 void* 时,此机制将被破坏。

关于C++将 self 传递给 self 神秘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8746721/

相关文章:

c++ - Qt:何时使用继承与设置属性?

c++ - 这是将一个类的私有(private) HWND 分配给另一个类的正确方法吗?

c# - 将字符转换为相应的虚拟键码

winapi - 指定以编程方式附加虚拟磁盘 (.vhd) 时要使用的驱动器号

c++ - 如何删除具有一些子项作为成员的 QGraphicsItem?

c++ - 什么是真正的虚函数?

c++ - 全局变量不更新自身 - C++

c++ - 在 C++ 中,如何在维护指向对象的指针的同时将对象推送到 vector ?

c++ - 引用或指针更快吗?

c++ - 指向虚函数的指针