【问题标题】:Is It possible to call methods from a subclass from a base class type?是否可以从基类类型的子类调用方法?
【发布时间】:2023-03-14 19:46:01
【问题描述】:

大家好,感谢阅读, 我是使用类的新手,在制作对象数组时遇到了问题, 我有一个基类和一个相同类型的数组,我想知道是否有可能 创建基类类型的子类并将它们放入一个数组并调用不是的方法 在基类中,如果这是一个不好的问题,我很抱歉,如果我的措辞不正确,我很抱歉,

#include <iostream>

int main()
{
    BaseClass* ObjectList[10];
    ObjectList[0] = new SubClass;
    ObjectList[0]->Load(10);
    ObjectList[0]->OtherFunction();     // How Can I Do This?
    return 0;
}


class BaseClass
{
public:
    virtual void Load(int Num) = 0;
};


class SubClass : public BaseClass
{
    void Load(int Num) override
    {
        std::cout << Num << std::flush;
    }
    void OtherFunction()
    {
        // Do Something
    }
};

谢谢

编辑 - 我的意图是有一个简单的基类,有几十个不同方法的子类,并有一个基类数组,

【问题讨论】:

  • 1.) 您可以在BaseClass 接口中将OtherFunction 设为虚函数。 2.) 如果这样做没有意义,您可以重新考虑将BaseClassSubClass 混合在同一个容器中,如果您实际上不能同等对待它们。 3.) 如果还有令人信服的理由,可以dynamic_cast基类指针。
  • 事情是;我的意图是有几十个基类,我知道在这个例子中它非常简化,我会尝试看看我是否可以用 dyanamic_cast 做任何事情
  • 你的意思是基类的几十个不同实例,这就是为什么你希望它们在一个数组中,或者是几十个具有不同接口的不同派生类,你希望它们的实例都在相同数组?如果是后者,我真的建议尝试找出真正属于一起的东西,也许不要把所有东西都放在一个“万物一体”的容器中。
  • 我一直在做的是一个游戏引擎,我有一个基类“关卡”,然后是每个关卡的子类。关卡管理器需要有一个包含所有不同关卡子类的数组,并从每个子类调用所有不同的方法,总之,几十个派生的
  • 这个问题的另一个例子是每个级别都有一个对象数组,每个对象类都派生自一个基对象类,每个对象都有通用和必要的方法,每个对象都有自己需要的方法被调用,

标签: c++ visual-studio class pointers abstract-class


【解决方案1】:

您必须将指针向下转换为真正的类(或至少是具有该方法的类)。如果您不需要任何控制,则可以使用 static_cast,如果您想要对演员表进行运行时验证,则可以使用 dynamic_cast

...
SubClass *psc = dynamic_cast<SubClass *>(ObjectList[0]);
if (psc != nullptr) {   // an invalid cast would set it to NULL
    psc->OtherFunction();
}
else {
    // process the error
}

【讨论】:

    【解决方案2】:

    您始终可以拥有多个指向同一个对象的指针(或引用)。

    int main()
    {
        BaseClass* ObjectList[10];
        SubClass TheSubclass;
        ObjectList[0] = &TheSubclass;
        ObjectList[0]->Load(10); // presumably in a loop
        TheSubclass.OtherFunction();
        return 0;
    }
    

    【讨论】:

    • 这对我来说非常有效,事实上,这是我的第二个游戏引擎,(第一个失败),刚刚完成了 Direct2D 的包装器设置,现在我正在研究如何做关卡, 对象, 实体, 事件等, 我觉得这种做事方式真的很巧妙, 谢谢
    猜你喜欢
    • 2014-04-30
    • 2015-11-14
    • 2011-01-05
    • 2016-10-05
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2021-12-04
    • 2010-10-28
    相关资源
    最近更新 更多