【问题标题】:Variable types from inherited classes来自继承类的变量类型
【发布时间】:2022-11-16 17:11:33
【问题描述】:

如果我有一个继承自基类的类,我可以将该基类用作 C++ 中的变量类型吗?

class Component {
    // Code here
};

class TransformComponent : public Component {
    // Code here
};

class Entity {
   // Code here
   
   Component *getComponent(Component *searchComponent) {
      // Code Here
   }
};

正如您在这里看到的,我使用基类“Component”作为返回类型和变量类型。问题在于用户可能会输入“TransformComponent”。我问这个的唯一原因是因为“TransformComponent”类继承自“Component”类,可能有办法做到这一点?

<Entity>.getComponent(Component &TransformComponent());

我正在寻找的答案既适用于返回类型,也适用于变量类型。

【问题讨论】:

  • 搜索关键字:virtualstd::variant(这是两种不同的解决方案)

标签: c++ function oop variable-types


【解决方案1】:

绝对地!这是 OOP 的优点之一。 TransformComponent 类型的实例化类既是 Component 的实例,也是 TransformComponent 的实例。

如果您有一些返回组件类型的函数,那么它可以返回从组件派生的任何类作为组件!如果您稍后想将它作为它的子类引用,您可能必须检查它的类型然后转换为它,但是您想要的是绝对可能的,并且您正在做正确的事情。

事实上,在您描述的示例中,如果您正在使用 Component 并且用户可能会传递一个 TransformComponent,则 Component 拥有的所有基本方法和属性也将由 TransformComponent 拥有。它看起来和感觉起来就像是一个组件,具有作为一个组件的所有好处。

唯一会出现问题的情况是,如果您特别想要访问 TransformComponent 的功能,并且用户传递了一个 Component。父类不知道子类的东西,因为它不是一个实例,它会为你抛出错误。子类建立在基类之上,因此它们具有所有基类的东西,还有更多。基本上,当您的示例被颠倒时,这只是一个问题。

【讨论】:

    【解决方案2】:

    您的 Entity.getComponent() 方法表明它只关心提供的参数是 Component ... 不是任何专业化,例如原始班级的TransformComponent

    所以,如果你发现自己写的逻辑是实际上关心“这个Component 可能实际上是一个TransformComponent”,然后“警钟应该响起”。在类中创建尽可能具体的方法定义。

    【讨论】:

    • 这是事实,但与其说是解决方案,不如说是评论。
    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 2013-04-19
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2019-03-28
    相关资源
    最近更新 更多