具有以下类:
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_cast
将 void*
转换为 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/