请教多态

randomp 2011-05-29 11:33:49
最近在写一个中国象棋的程序,一个棋子基类Chessman,派生类是车、马、炮等。Chessman有个virtual的成员函数move_valid用来判断所走的一步合不合规则。用一个指针数组Chessman* board_chess[10][9]来代表棋盘,若格子上有子,则把相应对象的指针放进去。为了实现悔棋功能,我用两个Chessman指针Chessman* last_orig,last_targ来存上一步棋,每次move更新。悔棋时用这两个更新棋盘上对应的位置。但是问题,复盘后回归的那个子总是调用基类Chessman的move_valid,根据多态,不是应该调用其对象的move_valid吗?求指导啊……多谢啦
这个是基类的定义:
class Chessman {
friend class Gameboard;
public:
Chessman(int i, int j, bool col);
Chessman& operator = (Chessman& c);
void change_icon(const string& image_name); //choose or unchoose one chessman then change icon
virtual bool move_valid(int i, int j, Gameboard& g) { return 0; }; //check if the move target is valid
virtual bool eat_valid(int i, int j, Gameboard& g) { return 0; }; //check if the eat behavior is valid
protected:
Chessman() { };
int init_i; //initial position
int init_j; //initial position
int cur_i; //current position
int cur_j; //current position
Image* icon; //icon
bool turn; //mark the turn of the play
bool choosed; //mark if the chessman has been choosed
bool color; //1 for red,0 for black
vector< vector<string> > image_name; //store the names of four images:black&&unchoosed,black&&choosed,red&&unchoosed,red&&choosed
};
...全文
197 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
randomp 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 q191201771 的回复:]

不要去new Chessman
你的chessman是什么
什么也不是
它只是棋子的抽象
你需要使用的是它的子类 例如你的pao ,ma
正像我前面所说的, 把chessman弄成虚基类
[/Quote]
可是虚基类的话,我要更新changed_orig的时候,万一前面它是个空指针,现在要申请一个新派生类指针,可是我现在是不知道派生类的类型的啊……用typeid?
ljt3969636 2011-05-30
  • 打赏
  • 举报
回复
board_chess类型是Chessman*如果*board_chess[][]=xxx;都是要被截断的
就想叫yoko 2011-05-30
  • 打赏
  • 举报
回复
不要去new Chessman
你的chessman是什么
什么也不是
它只是棋子的抽象
你需要使用的是它的子类 例如你的pao ,ma
正像我前面所说的, 把chessman弄成虚基类
randomp 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 q191201771 的回复:]

改成
last_orig = board[1][1]
[/Quote]
恩,我也发现了,但是复制指针貌似不行,起不到复盘的作用
randomp 2011-05-30
  • 打赏
  • 举报
回复
board_chess[last_p][last_q] = new Chessman(changed_orig->cur_i,changed_orig->cur_j,changed_orig->color);
*board_chess[last_p][last_q] = *changed_orig;

这是悔棋复盘的源代码,貌似这里出问题了,赋值后,board_chess[last_p][last_q]指向的是基类对象,而不是changed_orig指向的派生类对象
ljt3969636 2011-05-30
  • 打赏
  • 举报
回复

*last_orig = * board[1][1]你这里就有问题,既然是多态你要保证是指针间的赋值,进行对象间的赋值你要
考虑下你board是Chessman*类型你对它解引用赋值给另一个Chessman类型相当于,只截断复制基类部分,肯定不行
解决:
1.复制指针~
2.用typeid可以做动态类型判断,根据判断结果转成对应的派生类类型指针后再解引用后进行你想要的赋值
就想叫yoko 2011-05-30
  • 打赏
  • 举报
回复
改成
last_orig = board[1][1]
randomp 2011-05-30
  • 打赏
  • 举报
回复
初始化的时候都是用派生类的指针赋值的,悔棋更新棋盘后用Chessman* last_orig,last_targ,但此时Chessman* last_orig,last_targ指向的应该都是派生类对象,比如说board[1][1] = new pao(),*last_orig = * board[1][1]
就想叫yoko 2011-05-30
  • 打赏
  • 举报
回复
同2楼问
基类指针指向子类对象才能调用子类对象的虚函数
另外你的基类Chessman的move_valid应该设计为纯虚函数比较好
ryfdizuo 2011-05-30
  • 打赏
  • 举报
回复
Chessman* board_chess[10][9]怎么赋值的?
qq120848369 2011-05-30
  • 打赏
  • 举报
回复
你肯定是知道多态的,程序出问题了就去别的地方找原因,死盯着一个明明没有错的地方是发现不了错的。
randomp 2011-05-30
  • 打赏
  • 举报
回复
请问下怎么样可以在程序中间获取一个未知类型对象的类型,然后new一个这个类型的指针?
百度地图毕业设计源码 一个「学渣」从零开始的Web前端自学之路 从 13 年专科毕业开始,一路跌跌撞撞走了很多弯路,做过餐厅服务员,进过工厂干过流水线,做过客服,干过电话销售可以说经历相当的“丰富”。 最后的机缘巧合下,走上了前端开发之路,作为一个非计算机专业且低学历的人来说,自学编程其实不是件容易的事情,不过庆幸的是自己坚持下来了。 目前工作还算不错,收入在目前所在的城市不算高,不算低,生活也还过得去,继续加油努力,也希望自己在今后更上一层。 从 16 年下半年开始,我真正接触前端,到现在 2 年多的时间。开始之初,我没有任何的语言基础,完全从零的小白开始,就连「对象」我都弄不明白,更别说那些高深莫测的什么封装,继承,多态等。 当时自己也不知从何入手,怎么办呢?于是每当自己遇到困难时,就厚着脸皮去请教前辈大牛,然后就是去查阅资料,很多时候自己也很觉得不好意思,现在才发现人很多时候都耻于相别人请教,怕自己丢面子。 但作为一个过来人,我要告诉你请教前辈大牛真的很重要,可以让你少走很多的弯路,不要怕丢人,没面子,面子值几个钱?学到真本事才最重要。没有技能才叫真的没有面子。当然了我们在请教
该视频为2018年最新动力节点Java夜校班教学视频,本视频完全适合Java零基础的学生学习;不管您以前是从事的哪个行业,是否有一定计算机编程基础,您观看此教学视频之后,绝对会让您产生对编程的浓厚兴趣。Java夜校班是动力节点2017年继Java面授班、Java远程班之后开设的首个非全日制Java培训班,由大咖直播授课,Java夜校班由动力节点副教学总监,金牌讲师付老师带队并亲自授课,夜校班秉承动力节点一贯的专业品质态度,在课程质量,学生素质,就业服务上相当严格要求,并以学业满意就业为终极目标,打造国内一流Java业余培训班。无论你是渴望提前学热门技术、毕业找高薪工作的在校大学生;还是想要升职加薪技术提升的在职技术人员;亦或是想要低成本跨行专业的上班族,Java夜校班都是你的不二选择!本套Java夜校视频为现场教学录制,主要内容包括Java的开发环境搭建,基础语法,面向对象等内容;课堂案例非常贴近现实生活,每一个案例都堪称经典,生动并易于理解,如果您想走入Java软件开发行列,获得高薪,还在等什么,抓紧时间下载视频观看吧! 1.1 适用人群2 W l, E* V' k* W, h8 N% ~" J* K9 J Java夜校班视频教程适合:java零基础编程入门学员,java编程爱好者、IT爱好者,跨行和跨专业的学员。 1.2 课程概述 动力节点java夜校班视频教程特色:' G7 l8 l# m8 H: I' ~9 X& h; W 1. 由浅入深、注重原理【现场画:内存分析图】。 2. 课程包含: JDK安装、开发环境搭建,java编程基础知识,分支语句、循环语句、封装、继承、多态等并配备相应练习题,希望对大家有所帮助。7 f" T9 c- j9 S7 K 动力节点针对java夜校班视频服务特色:" p* ^$ y+ m+ n 1. 如果需要申请技术免费指导或者请教学习方法的学员请加任课老师qq:3074827228 2. 如果需要更多学习资料和学习工具的学员请加:java学习交流群:320686224 PS:只做java是动力节点的战略布局,让每位初学者顺利入门是动力节点零基础班老师的使命,学员的顺利就业才是动力节点的荣耀,希望我们一起融入到java 的世界里,加油!!!

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧