gpt4 book ai didi

C++:将派生指针转换为void指针,然后转换为抽象指针,并访问成员函数

转载 作者:行者123 更新时间:2023-11-30 04:09:15 25 4
gpt4 key购买 nike

我有一个 Controller 函数来处理一些对象,这些对象的特定类都派生自一个纯虚类。

class Abstract {
public:
virtual bool ReadyForWork() = 0;
virtual void DoWork() = 0;
};

然后我有以下内容:

class Specific : public virtual Abstract {
public:
bool ReadyForWork();
void DoWork();
};

程序创建一个 Specific 的实例并将其分配给链中的一个空指针。

vChain->Append(new Specific());

到目前为止,还不错。但是,当 Controller 函数启动并尝试访问 Specific 对 Abstract 的虚函数的实现时……呃。

Specific 对象在那里,我可以通过将 vChain 的内部 void* 转换为 Specific* 来访问它的内容,并且它全部检查出来,所以内存不足不是问题。但是当我将 void* 转换为 Abstract* 时,编译器丢失了对 Specific 实现的引用,将函数地址更改为与之前存在的完全不同的内容——即使指向对象本身的指针是正确的。尝试

// ...
Abstract *vWorkObj = (Abstract*)vChain->GetObj();
if (vWorkObj->ReadyForWork()) {
// ...

在我的脸上出现以下结果:

Unhandled exception at 0x00000054 in Proj.exe:
0xC0000005: Access violation executing location 0x00000054.

但如果我改为这样做

// ...
Abstract *vWorkObj = (Specific*)vChain->GetObj();
if (vWorkObj->ReadyForWork()) {
// ...

它运行没有打嗝。不幸的是,这对我帮助不大,因为会有多个类继承自 Abstract。

我在一个概念验证项目中尝试过类似的东西,它运行得很顺利:

// ...
bool ReadyForWork(Abstract *pObjPtr) {
// ...

// ...
Specific *vObj = new Specific();
if (ReadyForWork(vObj)) {
// ...

显然,编译器不喜欢在运行时解析继承类。 有没有一种方法可以在不显式告诉编译器它是哪个继承者的情况下访问抽象类的继承者?

我怀疑与 void* 之间的转换可能是导致编译器迷失方向的原因,但如果链可以尽可能保持通用,它会省去一些麻烦。

我正在为 Windows 桌面使用 VS2013 Express。感谢您的宝贵时间。

最佳答案

问题的直接来源可能是您正在使用虚拟继承,这使您的类的布局变得复杂。它通常只在复杂的多重继承场景中才需要,所以你可能不需要它。

您需要一个指向SpecificAbstract 子对象的指针,这在您的情况下可能不是相同的内存地址。因此,如果您将 Abstract* 存储在 vChain 中,请确保通过先转换为 Abstract* 来存储正确的地址:

vChain->Append(static_cast<Abstract*>(new Specific()));

除此之外还有一个问题,为什么 vChain 首先包含 void*。如果它将存储 Abstract*,则根本不需要显式转换,编译器会自动找出正确的指针。

关于C++:将派生指针转换为void指针,然后转换为抽象指针,并访问成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21372931/

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