使用以下类(class):
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()
返回了一个指向void*
对象的ChildChildClass
,则可以先将该static_cast
进行void*
转换为ChildChildClass*
,然后将其显式转换为BaseClass*
,或者仅将该ChildChildClass*
用作BaseClass*
,因为无论如何它都可以隐式转换(由于ChildChildClass
是从BaseClass
公开派生的,因此仅出于调用方法的目的就不必执行上流操作):
ChildChildClass* initialPointer = static_cast<ChildChildClass*>(someOtherMethod());
BaseClass* basePointer = static_cast<BaseClass*>(initialPointer);
但是,根据上面的代码,我被认为是您实际上并不知道
someOtherMethod()
返回指向ChildChildClass
对象的指针。否则,为什么还要在转换为ChildChildClass*
之前检查它是否这样做?如果您不知道void*
返回的someOtherMethod()
指向的对象的具体类型,则无法执行您要在此处执行的强制转换(因为有一种方法可以知道实际应该强制转换为什么) 。一种解决方案是将someOtherMethod()
更改为始终返回BaseClass*
或至少知道肯定总是指向void*
对象的BaseClass
。