纯虚函数
在一些情况下,父类不能给出虚函数的有意义的实现,这时就可以把虚函数说明为纯虚函数。纯虚函数不用在父类中实现,而是在子类中具体实现。例如,宠物类有个叫的函数,这个函数实现没有意义,宠物们没有统一的叫声啊。所以可以把“叫”这个函数在父类中说明为纯虚函数,而在子类中去实现这个函数。例如子类狗狗,“叫”的实现可以是输出“汪汪”;子类猫,“叫”的实现可以是输出“喵喵”。
关于纯虚函数要注意:
1. 是一种特殊的虚函数,是一种没有具体实现的虚函数。所以纯虚函数也有虚函数的特点,可以实现动态联遍。
2. 除了类的构造函数和析构函数不能调用纯虚函数外,其他函数都可以调用纯虚函数。
纯虚函数声明方式为:
class 类名{
virtual 返回类型 函数名(参数列表)=0;
};
嘿嘿,就是在虚函数的声明方式后面加了"=0"
抽象类
包含纯虚函数的类就叫做抽象类。既然抽象类中有一个函数是没有实现的,所以这也就决定了抽象类的特点:
1. 不能说明抽象类的对象。抽象类只能用来派生其他类。
2. 如果抽象类的子类里面,还没有这个纯虚函数的实现,那么这个子类也是一个抽象类。这个子类也只能去派生新类,不能声明对象。直到有一个类实现了纯虚函数,才能去声明这个类的对象。
\#include <iostream>
using namespace std;
class A
{
public:
virtual double Disp()=0; //纯虚函数的声明
};
class B:public A
{
public:
B(double a){r=a;} //构造函数
//实现了纯虚函数
virtual double Disp(){cout<<"r="<<r<<endl;}
private:
double r;
};
class C:public A
{
public:
C(double a){m=a;} //构造函数
//实现了纯虚函数
virtual double Disp(){cout<<"m="<<m<<endl;}
private:
double m;
};
void func(Rectangle &rec)
{
cout<<rrec.area()<<endl;
}
void main()
{
//A r; //不注释掉会报错
B b(4);
C c(5);
func(b);
func(c);
}
A类中定义了一个纯虚函数Disp,它没有实现,而是在子类B和子类C中实现。类A就是一个抽象类,在主函数中试图定义类A的对象是会报错。B类和C类实现了Disp,于是就不是抽象类了,可以声明B类和C类的对象。输出为:
r=4
m=5
从输出中可以看出,纯虚函数也可以进行动态联遍。
在右侧代码框中编写程序:宠物类Pet,数据成员有age,sex,有一个纯虚函数bark(叫)。定义子类Dog和子类Cat,实现这个纯虚函数