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

标签 c++ multiple-inheritance

具有以下类:

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/

相关文章:

c# - 有没有一种方便的方法可以将所有接口(interface)方法映射到一个子对象上?

c++ - 完全限定的静态成员变量中的歧义

python - 从 OrderedDict 和 defaultdict 继承

c++ - 指向多重继承中继承的数据成员的指针

c++ - 具有多个项目的 visual studio 解决方案无法编译

java - 大整数计算库推荐

c++ - main.cc :5:30: fatal error: folder/file. h: 没有那个文件或目录

c++ - 从数据库中选择客户信息并存储到 vector 中

c++ - 链接静态库的未解析符号

java - 通过接口(interface)实现多重继承