gpt4 book ai didi

c++ - 将一个类(class)转换到一个类(class)

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:04 25 4
gpt4 key购买 nike

[这里是嵌入式 C 的人,被嵌入式 C++ 搞糊涂了]

有一个派生自另一个类,如下:

class DerivedThing: public BaseThing {
...
}

有一些我无法控制的代码,它接受一个指向 DerivedThing 的指针。并最终指针指向BaseThing .我被引导相信这是有效的。无论如何,我需要实现自己的 DerivedThing但它需要子类化一些其他东西:

class MyDerivedThing: public BaseThing, public AnotherThing {
...
}

我需要做什么来确保 Actor 阵容仍然有效?我之所以这样问,是因为在我的例子中,肯定是调用了错误的函数。

编辑:我无法控制的代码中的转换是:

int setInterface(void* context)
{
interface[0] = (BaseThing *) context;
...

最佳答案

我评论的时候太悲观了!

自己转换为 BaseThing*,然后将 that 传递给采用 void* 的函数,应该可以工作。

按原样传递派生对象地址的问题是它的地址被隐式转换为 void*。结果,有关其类型和涉及的类层次结构的所有信息都丢失了。

然后接收函数假定 now-void* 指针直接指向 BaseThing。这是事情开始变得循环的地方,表现为调用错误函数的症状 - 如果你幸运的话 - 因为假设派生对象和任何特定的基础子对象具有相同的地址不是(始终/可靠地)一个有效的假设,其中多重和/或虚拟继承在起作用。

中场休息:目前尚不清楚为什么这种引用的碱基顺序会导致问题:

class MyDerivedThing: public BaseThing, public AnotherThing {

...但是有多种可能性。比如这里的三个类都没有虚方法,那应该没有问题。但是,例如,如果 BaseThing 不是虚拟的,而其他两个中的任何一个是,编译器可能会在对象的顶部放置一个虚拟表指针,这将炸毁任何只采用该地址的东西并假设那里有一个 BaseThing

无论如何 - 通过在传递之前转换你自己,编译器可以进行适当的类型感知转换,执行任何可能需要的调整算法,到你的对象中 BaseThing 的地址 - 然后传递那个函数。它仍然经历到 void* 的转换并返回,但现在可以保证最终代表 BaseThing 的地址。

我仍然会质疑作者为什么这个函数需要一个 void*。 C++ 的关键之一是类型安全。 void* 对此进行了 mock 。更糟糕的是,他们只是立即将所说的 void* 转换为 BaseThing*。那么,为什么不直接……首先使用 BaseThing* 呢?然后编译器可以在任何调用站点隐式执行提到的安全类型转换,而不是让您这样做。

关于c++ - 将一个类(class)转换到一个类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44120427/

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