#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;
}
运行结果:
分析:vp是指向Vehicle类对象的指针变量,即使让他指向了car,但实际上vp指向的是car中从基类继承的部分。通过指向基类对象的指针,只能访问派生类中的基类成员,而不能访问派生类增加的成员。
用虚函数就能顺利解决这个问题。在Vehicle类中声明run函数式,在最左面加一个关键字virtual,即virtual void run();
运行结果: