执行覆盖的继承函数

时间:2017-01-27 18:46:47

标签: c++ inheritance

说我有这两个类:

class Object {
public:
    virtual void update();      
};

class Actor : public Object {
public:
    void update();
}

还假设我正在创建actor类的实例,如下所示:

class somethingElse {
public:
    void init();

    std::vector<Object*> objects;
}

void somethingElse::init()
{
    Actor tmp;
    Object * tmpo = &tmp;
    objects.push_back(tmpo);
}

我稍后遍历objects

for (int i = 0; i < objects.size(); i++)
    objects.at(i)->update();

update()的两个版本上放置一个断点,显示被调用的那个是object类中的一个,而不是来自actor类的那个。为什么会这样,有没有解决这个问题的方法呢?

1 个答案:

答案 0 :(得分:2)

somethingElse::init() Actor tmp将超出范围并被销毁。指针将指向不再存在的对象。

new可以在这里提供帮助,但使用智能指针会更安全,例如std::shared_ptr

#include <iostream>
#include <vector>
#include <memory>

class Object {
public:
    virtual void update() { std::cout << "Object update()\n"; }
    virtual ~Object() = default;
};

class Actor : public Object {
public:
    void update()  { std::cout << "Actor update()\n"; }
};

class somethingElse {
public:
    void init();

    std::vector<std::shared_ptr<Object>> objects;
};

void somethingElse::init()
{
    //Actor tmp;
    auto tmpo = std::make_shared<Actor>();
    //Object * tmpo = &tmp;
    objects.push_back(tmpo);
}

int main()
{
    somethingElse objs;
    objs.init();
    auto& objects = objs.objects;


    for(int i = 0; i < objects.size(); i++)
        objects.at(i)->update();
}