gpt4 book ai didi

C++将 self 传递给 self 神秘

转载 作者:行者123 更新时间:2023-11-28 03:42:18 30 4
gpt4 key购买 nike

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

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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com