gpt4 book ai didi

c++ - 调用了虚函数,使用了父函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:29 25 4
gpt4 key购买 nike

关于 StackOverflow 的第一个问题。我想为我糟糕的英语道歉。

我实际上正在为视频游戏开发菜单。我想清除代码,所以我想使用vector来调用不同的功能(例如充电图片或修改文本)

代码如下:

菜单.hh :

class Menu
{
int _position
std::vector<Menu> _graph;
std::list<sf::Text> _text;
public:
//constructors and destructors
virtual std::list<sf::Text> &modifyText();
}

菜单.cpp

std::list<sf::Text> &modifyText()
{
std::cout << this->_position << std::endl;
this->_text = this->_graph[this->_position].modifyText();
return (this->_text); // don't care of the return
}

void Menu::initGame()
{
this->_graph.push_back(MenuBase());
// if i Put this code on the constructor, the constructor call himself and not the MenuBase constructor
this->modifyText();
}

菜单库.hpp

class MenuBase : public Menu
{
//constructor and destructor
std::list<sf::Text &modifyText(){std::cout << "work" << std::endl;
//I've more code, but it's just initialization of text and the return.
//The work is here to show what's happen on the standard output.
}

这段代码的输出是:0, 0 然后是 SegFault。我希望在标准输出上看到“0”然后“工作”。那么,为什么不调用 MenuBase 函数呢?

要获得完整代码,这里是 gitHub 存储库:https://github.com/Aridjar/AW_like

最佳答案

你看到的叫做Object Slicing .当您将 MenuBase 对象放入 Menu 对象的 vector 容器中时,Base 类中不存在的任何功能都将“切掉”您的对象;仅保留基类的功能。您的对象的行为不再超出您放入容器中的类的范围。

为了保持您想要的多态行为,用指针容器替换对象容器。为了避免手动内存管理带来的麻烦,与常规指针相比,更喜欢智能指针:

std::vector< std::shared_ptr<Menu> > _graph;

关于c++ - 调用了虚函数,使用了父函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25059208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com