【课程支撑】我的 C++程序设计课程教学材料

  要完成的任务详见第12周-任务2-双肩挑干部。题目要求

  分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求:
  (1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。
  (2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_Cadre类中还包含数据成员wages(工资)。
  (3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。
  (4)在类体中声明成员函数,在类外定义成员函数。
  (5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、职称、地址、电话,然后再用cout语句输出职务与工资。

  下面是某同学的解答:

#include <iostream>
#include <string>using namespace std;
class Teacher
{
public:Teacher(string nam, int a, char s, string addr, string tel,string t);void display();
protected:string name;int age;string title;string address;char sex;string telep;
};class Cadre
{
public:Cadre(string nam, int a, char s, string addr, string t,string p);void display1();
protected:string name;int age;string address;char sex;string telep;string post;
};
class Teacher_Cadre:public Teacher,public Cadre
{
public:Teacher_Cadre(string nam, int a, char s, string addr, string tel,float w,string t,string p);void show();
protected:string name;int age;string title;string address;char sex;string telep;string post;float wages;
};void Teacher::display()
{cout<<Teacher::name<<" "<<Teacher::age<<" "<<Teacher::sex<<" "<<Teacher::address<<" "<<Teacher::telep<<" "<<title<<endl;
}void Cadre::display1()
{cout<<post<<endl;
}
void Teacher_Cadre::show()
{display();cout<<wages<<endl;
}Teacher::Teacher(string nam, int a, char s, string addr, string tel,string t)
{name=nam;age=a;address=addr;telep=tel;title=t;
}
Cadre::Cadre(string nam, int a, char s, string addr, string tel,string p)
{name=nam;sex=s;age=a;address=addr;telep=tel;post=p;
};
Teacher_Cadre::Teacher_Cadre(string nam, int a, char s, string addr, string tel,float w,string t,string p):Teacher(nam,a,s,addr,tel,t),Cadre(nam,a,s,addr,tel,p)
{wages=w;
}void main()
{   Teacher_Cadre t1("malin",19,'f',"yantai","18253593419",10000,"student","study");t1.show();t1.display1();system("Pause");
}

程序的运行结果是:

  注意到画红圈的地方。寻找程序执行的流程,应该执行的是第50行,是Teacher::display()输出对象t1信息时显示了这一行。很时显,红圈中的?应该是性别 f 。看第50行没有问题,那究竟在哪儿见着鬼了?

  我决定用我们的法宝,调试工具这个照妖镜试试。问题出现在显示时,我在第88行t1.show();处加了断点并运行程序,打开自动窗口(窗口中出现的正是当前代码行涉及的对象的当前值),真相马上出现了。先看截屏:

  可以看到,可疑之处要输出的性别sex出现了3次:①来自基类Teacher;②来自基类Cadre;③来自派生类Teacher_Cadre。根据第50行代码可以判断,运行时出现的异常由于Teacher::sex造成的,而①处取值恰好为 ‘?’(其ASCII码值为52)。症状掌握了。那病因何在呢?

  显然,问题不在88行的show()函数,也不是48行Teacher::display()的毛病。问题出现在显示之前,对象根本没有获得正确的sex值。87行在定义对象时做了初始化,这个程序很短,疑点马上集中在对t1的初始化上。按照构造函数的执行过程逆着推上去,罪犯显形了:在63-70行Teacher的构造函数Teacher::Teacher(...)中,唯独缺少了对sex 数据成员的赋值!

  罪状昭然于天下,Bug伏法吧!

  单就运行结果看,程序没有问题了。但高度的责任感让我想到③处还有个问号。再一看,来自派生类Teacher_Cadre中的数据成员,除了wages的值正确,其他全……。推及Teacher_Cadre的构造函数(80-83行),确实,只给wages做了初始化。

  如果简单些处理,在Teacher_Cadre::Teacher_Cadre(...)中再加些赋值不就行了?事情没有这么简单。看Teacher_Cadre的声明(32-46行),其数据成员多达8个!Teacher_Cadre继承了两个类的数据成员,其中有同名的造成了二义性,这还不够麻烦,又将那些数据成员照抄着来了一份,这样,在派生类的对象中,同名的数据成员将被存储3份。如果这样的话,继承还有何用?这反映了对继承的理解还没有到位,或许仅是粗心了。

  如何更改程序,读者应该清楚了。

  作为结尾,再次提醒同学们用好调试工具。

  【课程支撑】我的 C++程序设计课程教学材料

Bug现形记(一):一个多重继承程序的查错相关推荐

  1. c语言程序只能调试成功一半,c语言程序的调试方法所谓程序调试是指对程序的查错和排错。调试程序一般应经过以下几个步骤:一、先进行人工检查,即静态检查。在写好一个程序以后,不要匆匆忙忙...

    c语言程序的调试方法 所谓程序调试是指对程序的查错和排错. 调试程序一般应经过以下几个步骤: 一.先进行人工检查,即静态检查. 在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查.这一步十分 ...

  2. C语言编写一个赋值程序,实验2 用C语言编写简单程序——2.1 基本数据处理.doc

    实验2 用C语言编写简单程序--2.1 基本数据处理 实验2 用C语言编写简单程序 2.1 基本数据处理 [实验目的] (1)掌握算术表达式和赋值表达式的使用. (2)掌握基本输出函数的使用. (3) ...

  3. 顺藤摸瓜:一个专黑建筑行业的QQ黏虫团伙现形记

    本文讲的是顺藤摸瓜:一个专黑建筑行业的QQ黏虫团伙现形记, 前言 QQ粘虫是已经流行多年的盗号木马,它会伪装QQ登陆界面,诱骗受害者在钓鱼窗口提交账号密码.近期,360QVM引擎团队发现一支专门攻击建 ...

  4. 另一个小程序 返回的支付结果如何得到_所以,你想用 $8 的价格修一个bug吗?...

    disclaimer:我对于 program repair 的了解仅限于一节软件工程的课,观点也大多是基于课上的讨论,我对于 program repair 相关的研究也没有进行更广泛的阅读,所以以下的 ...

  5. 记一个转行程序员的工作经历与感想(一)

    前言 随着科技的发展,现代人生活的节奏是越来越快,个人觉得程序员的生活节奏更快(个人观点),在忙碌的生活中总是很难找到一点点的空闲时间(就算有,估计也是用来睡眠,不知道为什么总是感觉程序员是一种睡眠不 ...

  6. bug诞生记——临时变量、栈变量导致的双杀

    这是<bug诞生记>的第一篇文章.本来想起个文艺点的名字,比如<Satan(撒旦)来了>,但是最后还是想让这系列的重心放在"bug的产生过程"和" ...

  7. 一个托盘程序演示 -闹钟 Alert

    From: http://www.vckbase.com/document/viewdoc/?id=996 下载源代码 关键字:托盘 Tray 想必大家都看见过那些在系统托盘(Tray)中的程序吧,本 ...

  8. 是非人生——一个菜鸟程序员的5年人生路

    注意:!!!!!!!!!!!! 文章可能还在连载.请关注: http://topic.csdn.net/u/20080318/10/e4543fc2-d726-465c-bc95-fea14b92db ...

  9. 一个游戏程序员的学习资料 (zz)

    一个游戏程序员的学习资料 //z 2012-4-19 14:39:51 PM IS2120@CSDN 想起写这篇文章是在看侯杰先生的<深入浅出MFC>时, 突然觉得自己在大学这几年关于游戏 ...

最新文章

  1. 《转》atomic assign retain
  2. Python_管理项目
  3. 机器学习中的MLE、MAP和贝叶斯估计
  4. Apache Flink 零基础入门(十三)Flink 计数器
  5. HDU - 1079 Calendar Game(博弈打表sg函数)
  6. jQuery中$(document).ready()和window.onload的区别?
  7. 当社恐和社恐相亲时,场面会有多尴尬?
  8. Python List reverse()方法
  9. esrgan_港中文-商汤联合实验室:ECCV2018 PIRM-SR 超分辨率比赛冠军:ESRGAN(已开源)...
  10. html5播放器占用带宽情况,分享|用 bmon 查看网络带宽使用情况
  11. 2021年中国住宅按揭服务市场趋势报告、技术动态创新及2027年市场预测
  12. java统计字符串数字出现次数_java实现统计字符串中大写字母,小写字母及数字出现次数的方法示例...
  13. 广东省汕头大学毕业设计论文撰写规范[2006]
  14. (1)Spring框架----通俗易懂的IoC原理
  15. neo4j ,neo4j-desktop国内下载镜像
  16. liunx的du命令查看文件夹大小
  17. 武汉年会签到,抽奖,摇一摇,微信上墙,互动大屏
  18. 机器视觉最常见的五大典型应用
  19. 在线测试输入输出语法的测试
  20. 软件测试及工程常用词汇(笔记一)

热门文章

  1. 了解如何在Microsoft Word中使用导航窗格
  2. NAT-DDNS内网穿透技术,解决动态域名解析难题
  3. Windows 安装微软 Edge 浏览器
  4. manifest引用build中的变量
  5. 商品交易系统之---产品介绍
  6. SWPUCTF2022 校内赛道部分 wp
  7. thrift的使用介绍
  8. PPTP中的PAC 和PNS
  9. oracle pns配置,Fanuc机器人IO配置和UIUO配置.doc
  10. 淘宝的虚拟产品怎么引?淘宝新店虚拟产品怎么引流?