VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 179|回复: 1

实用c++41课父类对象和子类对象相互转换

[复制链接]
61_avatar_middle
最佳答案
0 
在线会员 发表于 2020-5-28 09:16:46 | 显示全部楼层 |阅读模式
  1. void average_age(CStudent* p_arr_stud, int n_size)
  2. {
  3.     int total_age = 0;
  4. &#160; &#160; if (!p_arr_stud || n_size <= 0) return;
  5. &#160; &#160; for (int idx = 0; idx < n_size; ++idx)
  6. &#160; &#160; {
  7. &#160; &#160;&#160; &#160;&#160;&#160;total_age += p_arr_stud[idx].age;
  8. &#160; &#160; }

  9. &#160; &#160; EStudentType type = p_arr_stud[0].type;
  10. &#160; &#160; int aver_age = total_age / n_size;
  11. &#160; &#160; switch (type)
  12. &#160; &#160; {
  13. &#160; &#160; case EStudentType_Xiao:
  14. &#160; &#160;&#160; &#160;&#160;&#160;cout << "小学生的平均年龄是:" << aver_age << endl;
  15. &#160; &#160;&#160; &#160;&#160;&#160;break;
  16. &#160; &#160; case EStudentType_Zhong:
  17. &#160; &#160;&#160; &#160;&#160;&#160;cout << "中学生的平均年龄是:" << aver_age << endl;
  18. &#160; &#160;&#160; &#160;&#160;&#160;break;
  19. &#160; &#160; default:
  20. &#160; &#160;&#160; &#160;&#160;&#160;break;
  21. &#160; &#160; }
  22. }
复制代码


为啥改这个以后,结果不正确(经过调试发下数组[0]号位信息可以看到,后面就都不行了)




上一篇:Google 管理员
下一篇:求教,问个习题,谢谢
61_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-5-28 09:23:32 | 显示全部楼层
懂了,使用父类指针时的操作分析:

把一个子类数组变量赋值给一个数据元素父类的指针时,指针首先指向数组头的位置(如图)。

操作1:访问元素
访问第一个元素(元素0)时,没有任何问题。
访问下一个元素时,指针后移。按正常用法使用++操作或+=1操作。因为该指针是父类指针,所以偏移量为父类的大小sizeof(父类)。这时指针将指向图中“子类数据”的位置,而不是元素1的位置。这将导致出错。使用[]操作访问时也有同样的问题。

操作2:使用delete[]删除数据:
delete[]同样是按访问元素的方法逐个析构这些元素。因为它无法找到对象真正的起始位置。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-1 23:47

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表