第十三周 程序阅读二
2015-06-01 14:02
218 查看
阅读、修改和运行关于交通工具类的程序,回答问题,以理解相关技术方法
(1)请写出程序的执行结果,并在上机时对照理解
问题及代码:
![](http://img.blog.csdn.net/20150601141227635)
(1)请写出程序的执行结果,并在上机时对照理解
问题及代码:
#include <iostream> using namespace std; class Vehicle //交通工具 { public: void run() const { cout << "run a vehicle. "<<endl; } }; class Car: public Vehicle //汽车 { public: void run() const { cout << "run a car. "<<endl; } }; class Airplane: public Vehicle //飞机 { public: void run() const { cout << "run a airplane. "<<endl; } }; int main() { cout<<"(a) 直接用对象访问成员函数: "<<endl; Vehicle v; v.run(); Car car; Airplane airplane; car.run(); airplane.run(); cout<<"(b)用指向基类的指针访问成员函数: "<<endl; Vehicle *vp; vp=&car; vp->run(); vp=&airplane; vp->run(); return 0; }
运行结果:
<img src="http://img.blog.csdn.net/20150601140510177" alt="" />
请回答:当基类的指针指向派生类时,用指针调用同名成员函数,执行的是基类的成员函数,还是派生类的成员函数?为什么会这样?
答:执行的是基类的成员函数,原因:指向基类对象的指针,只能访问派生类中的基类成员,而不能访问派生类增加的成员。
2)如果将Vehicle类的定义修改为虚函数,其余不变,请写出程序的执行结果
问题及代码:
<pre class="cpp" name="code">#include <iostream> using namespace std; class Vehicle { public: virtual void run() const { cout << "run a vehicle. "<<endl; //(2) run()为虚函数 } }; class Car: public Vehicle //汽车 { public: void run() const { cout << "run a car. "<<endl; } }; class Airplane: public Vehicle //飞机 { public: void run() const { cout << "run a airplane. "<<endl; } }; int main() { cout<<"(a) 直接用对象访问成员函数: "<<endl; Vehicle v; v.run(); Car car; Airplane airplane; car.run(); airplane.run(); cout<<"(b)用指向基类的指针访问成员函数: "<<endl; Vehicle *vp; vp=&car; vp->run(); vp=&airplane; vp->run(); return 0; }运行结果:
请回答:当基类的指针指向派生类时,用指针调用同名虚成员函数,执行的是基类的成员函数,还是派生类的成员函数?为什么会这样?什么是多态性?请结合本例的运行结果说明。
答:执行的是派生类的成员函数。因为虚函数的作用就是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
多态性:向不同对象发送同一消息,不同的对象在接收时会产生不同的行为。
(3)如果将Vehicle类的定义修改为纯虚函数,找出main()函数中将使编译出错的行删除(或改为注释),请写出程序的执行结果,并在上机时对照理解
问题及代码:
#include <iostream> using namespace std; class Vehicle{ public: virtual void run() const = 0; //(3) run()为纯虚函数,const意指其为常成员函数,并非纯虚函数之必要 }; class Car: public Vehicle //汽车 { public: void run() const { cout << "run a car. "<<endl; } }; class Airplane: public Vehicle //飞机 { public: void run() const { cout << "run a airplane. "<<endl; } }; int main() { cout<<"(a) 直接用对象访问成员函数: "<<endl; Car car; Airplane airplane; car.run(); airplane.run(); cout<<"(b)用指向基类的指针访问成员函数: "<<endl; Vehicle *vp; vp=&car; vp->run(); vp=&airplane; vp->run(); return 0; }
运行结果:<img src="http://img.blog.csdn.net/20150601142119751" alt="" />
请回答:当基类同名成员函数定义为纯虚函数后,发生了什么现象?为什么会这样?
输出的是派生类中的成员函数。纯虚函数的作用就是在基类中,为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。
相关文章推荐
- 深入理解python之self
- Android项目框架搭建 (分析需求、整理资料)
- ember相关组件
- ember相关组件
- 微软Windows 10原生支持Dolby Audio
- 第十三周项目1——动物这样叫
- JavaScript之闭包
- 驴妈妈获锦江集团5亿元战略投资
- LoadRunner如何开展性能测试
- Android:TextView不获取焦点可以实现跑马灯的效果
- Unix网络编程学习笔记之第6章 I/O复用:select和poll函数
- 十进制负数转换成二进制数的方法及位运算
- 基于spark1.3.1的spark-sql实战-01
- 动态代理模式案例
- python模块相关
- Delphi XE8 利用HttpClient实现的一个App自动更新组件
- Cpp Primer<<学习函数-重载函数_2
- 软件设计的七大原则
- android studio解决Execution failed for task ':app:compileDebugAidl': aidl is missing
- 学习SpringMVC系列教程(一)Spring MVC入门