目的
1进一步多态性的基本概念
2. 学会利用虚函数实现多态性
3. 学会在设计中利用纯虚函数构造抽象基类
#include <iostream>
using namespace std;
class Vehicle
{
public:
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();
system("pause");
return 0;
}
当用对象访问数据函数时没有什么影响。但是当用基类得指针访问数据成员函数时基类得指针不能赋值为派生类的指针。
也就是说基类不能通过赋值指针的方式来访问派生类得成员函数,。
#include <iostream>
using namespace std;
class Vehicle
{
public:
virtual void run() const { cout << "run a vehicle. "<<endl; } //(2) run()为虚函数
};
class Car: public Vehicle
{
public:
virtual void run() const {cout << "run a car. "<<endl; }
};
class Airplane: public Vehicle
{
public:
virtual 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();
system("pause");
return 0;
}
当把各个类中得函数定义成虚函数时就可以解决基类不能通过赋值指针访问派生类的成员函数。
#include <iostream>
using namespace std;
class Vehicle
{
public:
//virtual void run() const { cout << "run a vehicle. "<<endl; } //(2) run()为虚函数
virtual void run() const=0;
};
class Car: public Vehicle
{
public:
virtual void run() const {cout << "run a car. "<<endl; }
};
class Airplane: public Vehicle
{
public:
virtual 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();
system("pause");
return 0;
}
当把函数定义为纯虚函数时,该类可以有派生类但是不能够作为正常类被对象所使用。
积累:当一个成员函数被声明为虚函数后,其派生类中的同名函数都会自动生成为虚函数。成为虚函数也就可以定义一个指向基类对象的指针变量,并使它指向同一类族中的某一对象
纯虚函数定义格式: virtual 函数类型 函数名 (参数列表) =0; // 0的作用是告诉系统这是一个纯虚函数。
抽象类
带有纯虚函数的类称为抽象类。抽象类具有下述一些特点:
(1) 抽象类只能作为基类使用,其纯虚函数的实现由派生类给出;但派生类仍可不给出纯虚函数的定义,继续作为抽象类存在。
(2) 抽象类不能定义对象,一般将该类的构造函数说明为保护的访问控制权限。
(3) 可以声明一个抽象类的指针和引用。通过指针和引用,可以指向并访问派生类对象,进而访问派生类的成员,这种访问是具有多态特征的。