派生类对象覆盖对象向量中的基类函数



所以我遇到了一个问题,当派生类存储在它的基类数组中时,它调用它的覆盖函数。

基类称为 Obstacle,派生类称为 Cliff。Barrier 有一个名为 drawToBackground 的虚函数,而继承自 Barrier 的 Cliff 也有一个名为 drawToBackground 的函数,两者都是 void。

然后我有一个障碍的向量,称为obstsVec。在这个向量中,我存储了一堆障碍物和一个悬崖。现在假设悬崖是向量的第五个元素。当我调用obstsVec[5].drawToBackground();它从 Barrier 类调用 drawToBackground 函数,而不是 cliff 类。

这是 c++ 中的一个功能,还是我只是声明了错误?

谢谢

您的类可能如下所示:

#include <iostream>
#include <vector>
class Obstacles {
public:
    Obstacles() {};
    virtual void drawToBackground() {
    std::cout << "Obstacle ";
    }
};
class Cliff : public Obstacles {
public:
    Cliff() : Obstacles() {};
    virtual void drawToBackground() {
    std::cout << "Cliff ";
    }
};

int main(int argc, char* argv[]) {
    std::vector<Obstacles*> vec;
    vec.push_back(new Obstacles());
    vec.push_back(new Cliff());
    vec[1]->drawToBackground();
    delete vec[1];
    delete vec[0];
    vec.clear();
}

你上面提到的数组...确保永远不要多态地使用数组,因为这会导致未定义的行为。

你只在向量中存储基类,正如@juanchopanza已经提到的,你已经完成了所谓的对象切片。您需要做的是通过指针以多态方式存储对象。

std::vector<Obstacle*> myObstacles;
myObstacles.push_back(new Cliff());
myObstacles[0]->drawToBackground();
// Remember to delete when you're done

当然,如果您可以访问C++11,那么您可以忘记内存管理方面的事情:

std::vector<std::unique_ptr<Obstacle>> myObstacles;
myObstacles.push_back(new Cliff());
for (const auto &obstacle : myObstacles)
{
    obstacle->drawToBackground();
}
// No need to delete anything

最新更新