使用类列表的虚方法
Virtual methods using class list C++
首先,请原谅我的英语很差。
我试图在c++中使用继承实现检查器,为此我设置了一个基类piece
,和2个派生类,pawn
和queen
。
我从职业列表中使用了两个列表,每个玩家一个,在第一个版本中(只有小兵)它运行得很好。
但现在我把pawn
列表改为piece
列表,我有一些问题。
我调用pawn
构造函数,所以对象是棋子,但当我调用一个方法(在piece
类中是虚拟的)时,它调用piece
方法!
这是我的:
piece.hpp:
virtual int calculardestino(int,tablero*){ cout <<"Not here" << endl;};
pawn.cpp:
int peon::calculardestino(int dir,tablero* B){ cout <<"Yep here is ok" << endl;}
我使用如下方式设置典当列表:
listarojo.push_back(peon(i,j,1));
我试着这样调用方法:
pos=listarojo.begin();
pos->calculardestino(0,this);
但是我从来没有得到"Yep here is ok"
,只有"Not here"
。
我试图使它纯虚拟,但我得到错误的编译。
您需要使用指针列表指向piece
对象(而不是piece
对象列表):
list<piece*> listarojo;
listarojo.push_back(new peon(i,j,1));
并且你必须在程序执行的稍后时刻删除这些对象:
for (auto ptr=listarojo.begin(); ptr!=listarojo.end(); ptr++)
delete *ptr;
看起来listarojo
是piece
对象的容器;因此,按下pawn
将切片,将其转换为基类类型。
对于多态性,它必须包含指向piece
的指针,您必须与new
一起分配,或者存储在列表生命周期中持续存在的地方。如果您选择使用new
,那么您可能想让它们成为智能指针,以节省记住删除它们的麻烦。
calculardestino
这样的函数的虚拟实现,不如考虑让它们成为纯虚拟的:
virtual int calculardestino(int,tablero*) = 0;
我试图使它纯虚拟,但我得到错误的编译。
确实,这个错误正是你想要的:切片被阻止了,所以你得到一个友好的错误,而不是意外的运行时行为。通过存储指针而不是piece
对象来修复潜在的问题,将修复该错误。
相关文章:
- 没有为自己的结构调用列表推回方法
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 有什么方法可以将元素添加到列表中,如图所示?
- 如何获取列表的每个对象并调用getName方法来打印其名称
- 处理从列表中删除指向对象的指针的"healthy"方法是什么?
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 生成包含给定类型的 N 个参数的可变参数列表的最佳方法?
- C++中有没有一种方法可以通过指定列表中的每个成员变量来构造对象
- 在 c++ 中迭代对列表的正确方法?
- 获取位于特定区间的已排序值列表的子列表的最短方法
- 提供初始值设定项列表构造函数的有效方法
- 使用 clang 获取类中的方法列表
- 使用doxygen分别提取类的公共方法列表
- 用于在C++代码库中检索函数和方法列表的工具
- 如何使用带有clang绑定的python获取C++头中的方法列表
- 使用android NativeActivity的方法列表
- 不同参数计数的结构方法列表
- 生成从可执行文件调用的c++方法列表