/
*
* 程序的版权和版本声明部分
* Copyright (c)2013, 烟台大学计算机学院学生
* All rightsreserved.
* 文件名称:
* 作者:袁静
* 完成日期: 2013年6月4日
* 版本号: v1.0
* 输入描述:无
* 问题描述
* 程序输出:
*/
//回答:如果将Vehicle类的定义修改为虚函数,其余不变。当基类的指针指向派生类是,用指针调用同名虚成员函数,
执行的是基类的成员函数还是派生类的成员函数?为什么?什么是派生类?
//
#include <iostream>
using namespace std;
class Vehicle
{
public:
virtual 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<<"1.直接用第用对象访问成员函数:"<<endl;
Vehicle v;
v.run();
Car c;
c.run();
Airplane a;
a.run();
cout<<"2.用指针基类的指针访问成员函数:"<<endl;
Vehicle *vp;
vp=&c;
vp->run();
vp=&a;
vp->run();
return 0;
}
答:
1.)执行的是派生类的成员函数。
2.)本来基类指针是用来指向基类对象的,如果用他指向派生类对象,则自动进行指针类型的转换,将派生类的
对象的指针转换为基类的指针,这样基类指针指向的是派生类对象中的积累部分。在把Vehicle改为虚函数之前,
是无法通过基类指针去调用派生类对象中的成员函数的。虚函数打破之一限制,在基类中run被声明为虚函数,在
声明派生类是被重载,这时派生类中的同名函数就取代了基类中的虚函数。因此,在使基类指针指向派生类对象后,调用
run函数就调用了派生类的run函数
3.)由虚函数实现的动态多样性就是:同一类族中不同对象,对同一函数调用做出不同的响应