从std :: vector中的每个对象调用重载函数

时间:2019-07-04 02:37:44

标签: c++ inheritance vector c++17

我正在OpenGL中开发自己的菜单系统。 我想要的是将与菜单相关的所有对象都放在一个矢量中,因此我可以轻松地像这样将它们全部循环:

for (auto i : menuObjects)
{
    i.checkInputs();
    i.draw();
}

我尝试了其他循环方法,甚至在基类的函数中加入了this->draw();,但显然以无限循环结束了。

我的基类基本上是这样:

class menuObject
{
public:

    virtual void draw() { }
    virtual void checkInputs() { }

};

继承的类是这样的:

class Button : public menuObject
{
public: 
    void draw()
    {
        ... drawing here ...
    }

    void checkInputs()
    {
        ... checking inputs here ...
    }

};

这是我将其保存在矢量中的方法:

std::vector<menuObject> menuObjects = {
    Button(... parameters here ...)
};

它永远不会进入重载函数。 我宁愿在自己的向量中没有每个不同的菜单对象。 有任何想法吗? <3

1 个答案:

答案 0 :(得分:3)

您遇到的问题是您不能在向量中直接存储不同类型的对象。

std::vector<menuObject> menuObjects = {
Button(... parameters here ...)
};

上面的代码将Button切成menuObject。当派生类被赋值给基类时,就会发生对象切片。与派生类关联的所有信息都将丢失。

您要做的是使用指针来允许多态。

因此,您的std::vector<menuObjects>将成为std::vector<menuObjects*>vector<std::unique_ptr<menuObjects>。如果此向量将负责管理menuObjects的生存期,则使用后者;否则,请使用前者。

侧面说明:如果您确实使用了前一个选项(即原始指针),请确保在menuObject的生命周期结束之前,从向量中移除无效的指针,然后再向量的生存期结束。