C ++,找到父母并调用它的方法?

时间:2017-08-30 22:20:16

标签: c++ inheritance vector override

我想说我在这里找到了解决这个问题的方法,但却找不到我想要的东西。我的问题可能有一个简单的解决方案。

所以请看这个例子:

class Component
{
public:
    virtual ~Component() {} // Make Polymorphic;

    void Update() {};
};
class UserMadeComponent : public Component
{
public:

    void Update() {};
};

int main()
{
    std::vector<Component*> _components;

    UserMadeComponent* UsersComponent = new UserMadeComponent;

    _components.push_back(UsersComponent);

    while (true)
    {
        for (auto _comp = _components.begin(); _comp != _components.end(); _comp++)
        {
            (*_comp)->Update();
        }
    }
}

现在程序员使用这个框架可以创建他们想要的任何类型的组件。他们会将此添加到组件向量中。我希望能够获得组件的类型并调用其Update方法。这是我想要完成的一个小图:

Link to image

所以我们的目标是打电话给父母&#34;更新方法。但是,用户可以创建他们喜欢的任何类型的组件。我不能假设这个数组中的任何组件的类型。我希望这是有道理的

// // EDIT

感谢大家帮助我理解虚拟方法调用。但是我怎么知道那个班级到底是什么。例如,用户创建了一个名为&#34; Transform&#34;的组件。我只想在组件数组中允许一个Transform实例。但显然如果我只知道它的组件指针,我就无法检查这种情况。

这很难解释,所以这是另一张图片:

Link to image

2 个答案:

答案 0 :(得分:2)

你正在倒退。而是创建一个名为do_update的虚拟方法,派生类会覆盖该方法。父类的update方法应调用虚拟do_update方法,该方法将正确分派。

标准库就是这样做的......

答案 1 :(得分:2)

使用虚拟方法。

父:

virtual void Update();

如果你希望Component类是“纯虚拟”,意味着你必须将它子类化,它只是代表一个抽象/接口,你可以这样做:

virtual void Update() = 0;

如果您尝试实例化Component对象,则会出现错误,只创建实现所有纯虚方法的子类对象。

编辑:

以下代码检查x是否为Transform。但是,这样做意味着您可能存在设计缺陷。为什么不创建一个语义上知道的容器来阻止用户添加两个转换呢?

dynamic_cast<Transform*>(x) == nullptr