一、填空题
(1)C++的两种联编方式为:  静态  联编和  动态  联编。
(2)C++支持两种多态性,静态联编所支持的多态性被称为  编译时的多态性  、动态联编所支持的多态性被称为  运行时的多态性  。
(3)重载函数在编译时表现出多态性,就是  静态   联编;而虚函数则在运行时表现出多态性是  动态  联编。
(4)为了区分重载函数,把一个派生类中重定义基类的虚函数称为  覆盖   。
(5)如果派生类与基类的虚函数仅仅返回类型不同,其余相同,则C++认为是  使用不恰当的虚函数  。
(6)在构造函数和析构函数中调用虚函数时,采用  静态  联编。
(7)纯虚函数的定义是在虚函数定义的基础上,再让函数等于  0  。
(8)对于包含有纯虚函数的类被称为  抽象类  。

二、选择题(至少选一个,可以多选)
(1)用关键字( A )标记的函数被称为虚函数。
A. virtual                   B. private                    C. public                 D. protected
(2)在C++中,要实现动态联编,必须使用( D )调用虚函数。
A. 类名                      B. 派生类指针               C. 对象名                 D. 基类指针
(3)下列函数中,可以作为虚函数的是( BD )。
A. 普通函数                B. 非静态成员函数        C. 构造函数             D. 析构函数
(4)在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值( B )。
A. 不同                       B. 相同                         C. 相容                    D. 部分相同
(5)使用虚函数保证了在通过一个基类类型的指针(含引用)调用一个虚函数时,C++系统对该调用进行( A ),但是,在通过一个对象访问一个虚函数时,使用( B )。
A. 动态联编                B. 静态联编                   C. 动态编译              D. 静态编译
(6)下面函数原型声明中,(  B  )声明的func()为纯虚函数。
A. void func()=0;                                            B. virtual void func()=0;
C. vitual void func();                                       D. virtual void func(){};
(7)若一个类中含有纯虚函数,则该类称为(  C  )。
A. 基类                       B. 虚基类                       C. 抽象类                 D. 派生类
(8)假设Myclass为抽象类,下列声明( CD  )是错误的。
A. Myclass& func(int);                                     B. Myclass * pp;
C. int func(Myclass);                                        D. Myclass Obj;
(9)下面描述中,( BD  )是正确的。
A. 虚函数是没有实现的函数                                B. 纯虚函数的实现是在派生类中定义
C. 抽象类是只有纯虚函数的类                             D. 抽象类指针可以指向不同的派生类

三、判断题
(1)抽象类中只能有一个纯虚数。                                                                         ( 错 )
(2)构造函数和析构函数都不能说明为虚基数。                                                             ( 错 )
(3)程序中可以说明抽象类的指针或引用。                                                                 ( 对 )
(4)一个类中的虚基数说明不仅对基类中的同名函数有影响,而且对它的派生类中的重定义的函数也有影响         ( 错 )
(5)在构造函数和析构函数中调用虚函数时,采用动态联编,即它们所调用的虚函数时是在派生类中重定义的虚函数 ( 错 )
(6)因为没有为纯虚函数定义代码,所以在构造函数和析构函数内均不可调用纯虚函数。                         ( 对 )

四、简答题
(1)什么叫做多态性?在C++中是如何实现多态的?
答:多态性就是同一符号或名字在不同情况下具有不同解释的现象,即是指同一个函数的多种形态。C++可以支持两种多态性,编译时的多态性和运行时的多态性。
多态性有两种变现形式:一种是不同的对象在收到相同的消息时,产生不同的动作,主要通过虚函数来实现;另一种是同一对象收到相同的消息却产生不同的函数调用,主要通过函数重载来实现。
(2)虚函数与一般重载函数有哪些区别?
答:虚函数与一般重载函数的区别,主要有以下几点:
 重载函数只要求函数有相同的函数名,并且重载函数是在相同作用域中定义的名字相同的不同函数。而虚函数不仅要求函数名相同,而且要求函数的签名、返回类型也相同。也就是说函数原型必须完全相同,而且虚函数特性必须是体现在基类和派生类的类层次结构中。
  重载函数可以是成员函数或友元函数,而虚函数只能是非静态成员函数。
  构造函数可以重载,析构函数不能重载。正好相反,构造函数不能定义为虚函数,析构函数能定义为虚函数。
  重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据,而虚函数是根据对象的不同去调用不同类的虚函数。
 重载函数在编译时表现出多态性,是静态联编;而虚函数则在运行时表现出多态性是动态联编,因此说动态联编是C++的精髓。
(3)什么叫做抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?
答:一个类可以说明多个纯虚函数,对于包含有纯虚函数的类被称为抽象。抽象类用来描述一组子类的共同的操作接口,它用作基类。抽象类的派生类不一定要给出纯虚函数的实现。如果没有在派生类中给出纯虚函数的实现,则需在派生类中仍将它说明为纯虚函数,否则编译器将给出错误信息。说明了纯虚函数的派生类仍是抽象类。
(4)能否声明虚析构函数?有何用途?
答:能声明虚析构函数。如果一个类中定义了虚函数,析构函数也应说明为虚函数。delete运算符和析构函数一起工作,当使用delete删除一个对象时,delete隐含着对析构函数的一次调用,这样保证了使用基类类型的指针能够调用适当的析构函数针对不同的对象进行清除工作。
五、程序设计题
(1)使用虚函数编写程序求球体和圆柱体的体积及表面积。由于球体和圆柱体都可以看作由圆继承而来,所以可以定义圆类Circle作为基类。在Circle类中定义一个数据成员radius和两个虚函数area()和volume()。由Circle 类派生Sphere类和Column类。在派生类中对虚函数area()和volume()重新定义,分别求球体和圆柱体的体积及表面积。
[cpp] view plaincopy
  1. <span style="font-family:SimSun;font-size:16px;">#include <iostream>
  2. #include <iomanip>
  3. using std::fixed;
  4. using std::setprecision;
  5. using namespace std;
  6. const double PI=3.14159265;
  7. class Circle
  8. { public:
  9. Circle(double r) {radius=r;}
  10. virtual double area() {return 0.0;}
  11. virtual double volume() {return 0.0;}
  12. protected:
  13. double radius;
  14. };
  15. class Sphere:public Circle
  16. {  public:
  17. Sphere(double r):Circle(r){ }
  18. double area() {return 4.0*PI*radius*radius;}
  19. double volume()
  20. { return 4.0/3.0*PI*radius*radius*radius;}
  21. };
  22. class Column:public Circle
  23. {  public:
  24. Column(double r,double h):Circle(r){height=h;}
  25. double area()
  26. { return 2.0*PI*radius*(height+radius );}
  27. double volume()
  28. { return PI*radius*radius*height;}
  29. private:
  30. double height;
  31. };
  32. int main()
  33. {
  34. Sphere s(3.0);
  35. Column c(4.0,5.0);
  36. cout <<fixed<<setprecision(2)<< "球的体积 = " << s.volume() << endl;
  37. cout << fixed<<setprecision(2)<<"球的表面积 = " << s.area() << endl;
  38. cout << fixed<<setprecision(2)<<"圆柱体的体积 = " << c.volume() << endl;
  39. cout <<fixed<<setprecision(2)<< "圆柱体的表面积 = " << c.area() << endl;
  40. return 0;
  41. }</span>
程序输出结果如下:
(2)编写一个程序,用于计算正方形、三角形和圆的面积及计算各类形状的总面积。
[cpp] view plaincopy
  1. <span style="font-family:SimSun;font-size:16px;">#include<iostream>
  2. #include<iomanip>
  3. using std::fixed;
  4. using std::setprecision;
  5. const double PI=3.1415;
  6. using namespace std;
  7. class square
  8. {
  9. public:
  10. square(float l){length=l;}
  11. virtual float area(){return length*length;}
  12. private:
  13. float length;
  14. };
  15. class triangle
  16. {
  17. public:
  18. triangle(float b,float h){base=b;height=h;}
  19. virtual float area(){return base*height/2.0;}
  20. private:
  21. float base,height;
  22. };
  23. class Circle
  24. {
  25. public:
  26. Circle(double r){radius=r;}
  27. virtual double area(){return PI*radius*radius;}
  28. private:
  29. double radius;
  30. };
  31. int main()
  32. {
  33. square s(6.0);
  34. triangle t(3.0,4.0);
  35. Circle c(5.0);
  36. cout<<fixed<<setprecision(2)<<"正方形的面积="<<s.area()<<endl;
  37. cout<<fixed<<setprecision(2)<<"三角形的面积="<<t.area()<<endl;
  38. cout<<fixed<<setprecision(2)<<"圆的表面积="<<c.area()<<endl;
  39. cout<<fixed<<setprecision(2)<<"各类形状的总面积="<<s.area()+c.area()+t.area()<<endl;
  40. return 0;
  41. }</span>

程序输出结果如下:

第五章 课后习题(P139-140)相关推荐

  1. c语言定义int 输出4386,大学C语言第五章课后习题参考程序

    考试,二级C语言备考 第五章课后习题参考程序 5.1 编写程序,求100-2000之间所有3的倍数之和,当和大于1000时结束. (参考答案:900) #include int main() { in ...

  2. 疯狂java讲义第五章课后习题答案

    1.编写一个学生类,提供name.age.gender.phone.address.cmail成员变量,且为每个成员变量提供 seter.geter方法.为学生类提供默认的构造器和带所有成员变量的构造 ...

  3. HTML+CSS+JavaScript网页制作案例教程-黑马程序员-第五章课后习题(课程介绍专栏效果)

    黑马程序员编著的教材  HTML+CSS+JavaScript网页制作案例教程 第五章:"课程介绍"专栏-课后习题参考代码 题目原型: 请结合给出的素材,运用列表标记,超链接标记以 ...

  4. 《Python语言程序设计》王恺 机械工业出版社 第五章课后习题答案

    第五章 序列.集合和字典 5.8 课后习题 (1)Python 中,通过列表中的 index 方法可以根据指定值查找第一个匹配的列表元素 的位置. (2)Python 中,通过列表中的 insert ...

  5. 《软件工程教程》(第2版) 主编:吴迪 马宏茹 丁万宁 第五章课后习题参考答案

    第5章   总详细设计  课后习题参考答案 一.填空题 (1)结构化程序设计方法的要点是使用 顺序.选择和循环 结构,自顶向下.逐步求精地构造算法或程序 (2)为了产生结构化的流程图,应由三种基本控制 ...

  6. python第五章课后题答案_python程序设计基础(嵩天)第五章课后习题部分答案

    原博文 2019-10-13 13:50 − 第五章p1515.2:实现isodd()函数,参数为整数,如果参数为奇数,返回true,否则返回false.def isodd(s): x=eval(s) ...

  7. 材料力学Ⅰ(第六版)第五章课后习题答案

    第一章 绪论 第二章 拉伸.压缩与剪切 第三章 扭转 第四章 弯曲内力 第五章 弯曲应力 第六章 弯曲变形 第七章 应力和应变分析强度理论 第八章 组合变形 第九章 压杆稳定

  8. C++语言程序设计第五版 - 郑莉(第五章课后习题)

    第5章  数据的共享与保护 5-7定义一个Cat类,拥有静态数据成员 numOfCats,记录Cat的个体数目:静态成员函数getNumOfCats(),读取numOfCats.设计程序测试这个类,体 ...

  9. 操作系统第五章课后习题答案

    第一题 1 ,旋转型设备上信息的优化分布能减少为若干个拍服务的总时间.设磁鼓上分为20 V 个区,每区存放一个记录,磁鼓旋转一周需20 毫秒,读出每个记录平均需用1 毫秒,读出后经2 毫秒处理,再继续 ...

最新文章

  1. php HASHTABLE 实现
  2. 数组不能将数值传给int_java数组查找常见情况
  3. JS检查是否支持Storage
  4. 【Python】Python办公自动化 | 一键给PDF文件加密,超方便
  5. LiveVideoStack Meet | 苏州站全记录
  6. 如何关闭Windows10任务栏里的应用图标
  7. 项目中的富文本编辑器该如何选择?
  8. leetcode - 226. 翻转二叉树
  9. pytorch torch.nn.Embedding
  10. [Hive]Hive合并小文件
  11. 多功能pdf编辑器PDF Office Max for mac
  12. ngx_lua中的协程调度(六)之ngx_http_lua_run_posted_thread
  13. unity打开htc vive 的前置摄像头 和 实现增强现实效果
  14. Oracle分析函数之Rank函数
  15. eeprom和编程器固件 k2_斐讯K1K2新版固件v22.4.xx.xx简单刷机教程
  16. 数学建模国奖论文2019-C-C308分析
  17. 【Java】菜鸟教程个人Java学习笔记
  18. 微信小程序的选择收货地址、新增地址、地址管理等模块的总结(1)
  19. MD5校验文件完整性
  20. 计算某天是某年的第多少天

热门文章

  1. 计算x的n次方 高效算法
  2. Notepad++下载安装介绍教程
  3. 【算法讲20:Dsu on Tree】树上数颜色 | Lomsat gelral
  4. FontAwesome 图标 class=fa fa-home
  5. 如何在windows11系统中打开ie11浏览网页
  6. Auto MPG 汽车油耗预测(tensorflow深度学习龙书笔记)
  7. 高中知识复习——log2(n)
  8. 转置矩阵,逆矩阵和倒转置矩阵
  9. 每月更新的Mac软件序列号查询小机器人KCNScrew Pack
  10. php教程--案例4(判断闰年)