繁体   English   中英

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

[英]Derived class object override a function of base class in a vector of objects

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

基类称为Obstacle,派生类称为Cliff。 障碍物有一个名为drawToBackground的虚函数,而从Obstacle继承的Cliff也有一个名为drawToBackground的函数,两者都是无效的。

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

这是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM