C++学习笔记 -抽象基类和纯虚函数
为避免实例化无意义的基类,就可以使用抽象类来实现,抽象类一般都是做为基类来使用的,故称为抽象基类,或者也可以将具体功能定义为纯虚函数。
纯虚函数是一个特殊的函数,它没有具体的实现(没有函数体的实现)。
纯虚函数需要定义在类体内:virtual <类型><函数名>(<参数列表>)=0;
使用纯属函数应注意以下几点:
1.纯虚函数没有函数体;
2.函数最后的“=0"表示告诉编译系统该函数是纯虚函数,而并不是返回值是0;
3.纯虚函数没有函数体就没有实现,但是最后应有分号。
4.如果有一个基类定义了一个纯虚函数,该函数的实现通常在其派生类中。基类的纯虚函数就好比是一个接口,它告诉编译系统该函数的实现是在其派生类中,只有被继承才能调用该函数。注意如果在派生类中没有实现该函数,那么该函数仍然是纯虚函数。
上一例的代码,在基类中修改为纯虚函数,运行结果相同。
#include
using namespace std;
class Transport
{
public:
virtual void setspeed(int s)=0;//定义虚函数,设置参数
virtual void transport()=0;//定义虚函数,显示状态
private:
int speed;//私有成员
};
class Car:public Transport//public方式继承Transport
{
public:
virtual void setspeed(int s)//定义虚函数,设置参数
{
speed=s;
cout<<"in Car setspeed()"<<ENDL;< p>
}
virtual void transport()//定义虚函数,显示状态
{
cout<<"Car transport in"<<SPEED<<ENDL;< p>
}
private:
int speed;
};
class Trian:public Transport//public方式继承Transport
{
public:
virtual void setspeed(int s)//定义虚函数,设置参数
{
speed=s;
cout<<"in Trian setspeed()"<<ENDL;< p>
}
virtual void transport()//定义虚函数,显示状态
{
cout<<"Trian transport in"<<SPEED<<ENDL;< p>
}
private:
int speed;
};
void print(Transport & t)//全局函数,参数是基类的引用
{
t.transport();
}
void main()
{
Transport *pt;//定义基类对象指针
Car c;
pt=&c;//指针指向对象Car的对象c
pt->setspeed(60);//访问相应虚函数
Trian t;
pt=&t;
pt->setspeed(200);//指针指向对象Trian的对象t
print(c);//调用全局函数
print(t);
}