gpt4 book ai didi

c++ - 将多重继承的对象转换到 void* 或从 void* 转换

转载 作者:行者123 更新时间:2023-11-28 06:51:57 27 4
gpt4 key购买 nike

<分区>

我知道,类似的问题已经得到解答,但仍有一些问题令我困惑。此处的示例是从真实代码库中摘录的自然简化和无关内容的摘录。

class X {...};
class Y {...};
class Z : public X, public Y {...}

现在我创建 Z 对象并通过 C 接口(interface)将其放入(如 void*)

Z* z = new Z();
doSomeWeirdStuff(z);

然后在一些回调中我取回了我的对象(仍然是 void*)。

void callback(void* data)
{
Z* z1 = static_cast<Z*>(data);
Z* z2 = dynamic_cast<Z*>(static_cast<Y*>(data));
}

z1 是垃圾。由于 XY 具有相同的布局,因此在调试时,我看到 z1 在对象的 X 部分中具有 Y 的值。我预计,因为我将对象创建为 Z,所以应该是正确的。相反,z2 似乎是正确的。

顺便说一句 - 类没有共同的祖先,这不是虚拟继承。

为什么?我在这里缺少什么?


编辑:我所缺少的东西非常简单,为此我应该用头撞墙。长话短说:XY 使用 this 在它们的构造函数中初始化用户数据,所以我实际上传递了一个指向 的指针Y 当我以为是 Z...

我将接受@user2079303 的回答,因为它让我又检查了代码三遍才发现这个……

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