【问题标题】:C++ Getting child class from parent ClassC++从父类获取子类
【发布时间】:2021-12-26 09:45:23
【问题描述】:

(C++) 从父类获取子类的最佳方法是什么,例如:我正在制作一个游戏引擎,所以我有名为网格、灯光和相机的类,它们都是不同的,但它们有一个共同点,它们都有变换,所以我做了一个名为节点和网格的类,灯光和相机都扩展了节点。 (节点保存常见的数据,如转换,只能保存这三种类型中的一种)。所以我将拥有这些节点的层次结构(转换)。所以稍后在我遍历这个层次结构之后,在某个节点上我如何获得我的网格或灯光,因为我如何知道特定节点是否持有网格或灯光或相机,因为节点是一个通用类并且可以容纳所有 3这些。长话短说有没有办法知道什么类型的对象节点持有,如果我发现我怎样才能从节点获取网格对象或灯光对象???提前致谢!

示例代码:

class Node // generic class
{
    private:
       //hold transformation data
};

class Mesh : public Node
{
    //mesh information
};

class Light : public Node
{
//mesh information
};

...

int Main()
{
    Node node;
    //node will be initialized with a mesh, light or camera


   //so how do i know if this node is a mesh, light, or etc...
   //and how to get the mesh/light/camera data

}

【问题讨论】:

  • 定义像Node 这样的接口的要点是您不需要需要确切知道您指向的是哪个派生类,您可以调用属于接口,它们将被分派到适当的具体对象。但是,您发布的代码中很少有 sn-ps 表明您将遭受object slicing 的困扰。不幸的是,C++ 中的多态性主题有点过于宽泛,无法用一个 SO 问题来回答。
  • 如果MeshLight不能用同一个接口描述,你就和Liskov Substitution Principle发生冲突了

标签: c++ inheritance parent-child hierarchy


【解决方案1】:

最好的方法是父母对孩子的接口扩展一无所知。您确定 Node 应该是父级吗?一种选择是为预定义的一组转换制作节点容器(手工制作或标准,如variant)。例如:

class Mesh
{
    //mesh information
};

class Light
{
//mesh information
};

using Node = std::variant<Mesh, Light>;

int Main()
{
    Node node{Mesh{}};
    // ....
    if(const Mesh* m = std::get_if<Mesh>(&node)) {
      // do mesh related things
      m->transform();
    } else if (const Light* l = std::get_if<Light>(&node)) {
      // do light related things with l
    }
    return 0;
}

另一个选项是左类层次结构并使用dynamic_cast 将基类转换为其中一个子类。但是使用 dynamic_cast 总是表明设计失败

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-07
    • 2012-03-23
    • 1970-01-01
    • 2016-06-25
    • 2016-09-17
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多