如果一个类只作为基类来使用,就绝不会在程序中生成基类的对象,这样基类中的disp函数的实体就不会使用。由于未使用的函数实体是一种浪费,可以把函数实体省略掉,无函数实体的虚函数叫做纯虚函数。
/*纯虚函数的定义和使用*/
#include<iostream>
using namespace std;
class test1
{
int x;
int y;
public:
test1(int a,int b):x(a),y(b)
{
}
int getx()
{
return x;
}
int gety()
{
return y;
}
virtual void disp()=0;
};
class test2:public test1
{
int z;
public:
test2(int a,int b,int c):test1(a,b)
{
z=c;
}
void disp()
{
cout<<"x="<<getx()<<endl;
cout<<"y="<<gety()<<endl;
cout<<"z="<<z<<endl;
}
};
class test3:public test1
{
int v;
public:
test3(int a,int b,int c):test1(a,b)
{
v=c;
}
void disp()
{
cout<<"x="<<getx()<<endl;
cout<<"y="<<gety()<<endl;
cout<<"v="<<v<<endl;
}
};
int main()
{
test2 p(1,2,3),*q;
test3 r(10,20,30);
q=&p;
q->disp();
q=(test2 *)&r;
q->disp();
}
说明:
(1)如果一个类的定义中包含纯虚函数,则不能定义该类的对象。test1 dt;
编译出错。
(2)具有两个相同基类的两个派生类对象的指针也不能自动的相互转换,需要进行强制类型转换。 如:q=(test2 *)&r;
(3)在执行语句q=(test2 *)&r;
之后,由q所调用的函数必须是在test2
类中存在的函数(test1
类中可以不存在),否则会出错。
抽象类
包含纯虚函数的类被称为抽象类,也就是在抽象类中包含没有函数体定义的函数。
抽象类是不能定义对象的!