gpt4 book ai didi

C++ 将子子类转换为基类

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:59 24 4
gpt4 key购买 nike

使用以下类:

enum class OBJECT_TYPE {TYPE_1, TYPE_2, TYPE_3};

class BaseClass {
public:
BaseClass();
virtual ~BaseClass();
OBJECT_TYPE getObjectType() { return m_objectType; }
protected:
OBJECT_TYPE m_objectType;
}

class ChildClass : public BaseClass {
public:
ChildClass();
virtual ~ChildClass();
virtual void init() = 0;
protected:
// some other variables
}

class ChildChildClass : public ChildClass {
public:
ChildChildClass ();
~ChildChildClass ();
void init() override { m_objectType = OBJECT_TYPE::TYPE_3 }
private:
// some other variables
}

在代码库的单独部分,我如何将 void* 转换为 ChildChildClass 实例,再转换为 BaseClass* 以便我可以调用 getObjectType() 来确定它指向的对象类型。我目前正在这样做:

(someOtherMethod()void* 返回给 ChildChildClass)

void* initialPointer = someOtherMethod();
BaseClass* basePointer = static_cast<BaseClass>(initialPointer);
if (basePointer->getObjectType() == OBJECT_TYPE::TYPE_3) {
ChildChildClass* childChildPointer = static_cast<ChildChildClass*>(basePointer);
}

我想我在使用继承时可能会误解转换指针,因为我得到了返回的 objectType 的无意义值,所以任何建议或信息将不胜感激!

最佳答案

我将忽略此类设计的众多问题,并假设您有非常充分的理由(即无法更改设计)想要执行您要求的操作.如果你知道 someOtherMethod() 返回一个指向 ChildChildClass 对象的 void*,那么你可以先 static_castvoid* 转换为 ChildChildClass*,然后执行显式向上转换为 BaseClass* 或仅使用该 ChildChildClass* 作为 BaseClass* 因为它无论如何都可以隐式转换(应该没有必要为了调用方法而执行向上转换,因为 ChildChildClass 公开派生来自 BaseClass):

ChildChildClass* initialPointer = static_cast<ChildChildClass*>(someOtherMethod());
BaseClass* basePointer = static_cast<BaseClass*>(initialPointer);

但是,根据您上面的代码,我相信您实际上并不知道 someOtherMethod() 返回指向 ChildChildClass 对象的指针。否则,为什么必须在转换为 ChildChildClass* 之前检查它是否正确?如果你不知道someOtherMethod()返回的void*指向的具体对象类型,那么就没有办法执行你想执行的转换在这里(因为有知道什么应该实际投入什么的方法)。一种解决方案是更改 someOtherMethod() 以始终返回一个 BaseClass* 或至少一个您确定始终指向的 void*一个 BaseClass 对象……

关于C++ 将子子类转换为基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53462227/

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