一、纯虚函数定义
1.纯虚函数是在基类中声明的虚函数,首先最起码是在基类中的虚函数
2.纯虚函数在基类中是没有定义的,这里指基类,但任何子类中都要定义该纯虚函数的实现方法
3.在基类中实现纯虚函数的方法是虚函数原型后加“=0”,例如:
virtual void function()=0;
为什么要引入纯虚函数?
1.因为当你顶级基类A有一虚函数play();,而A的子类B也有play();,A的子类C也有play();,这就说明如果顶级基类A中的play();若定义怎么玩是不合理的。因为B有B的玩法C有C的玩法。所以这种情况下定义为纯虚函数目的在于使子类仅仅只是继承函数的接口,告诉子类的设计者“你必须在子类中提供一个纯虚函数的实现,但我不知道你会怎么样实现它”
2.引入纯虚函数,则编译器要求在子类中必须予以重写以实现多态性
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <cmath>
#include <iostream>
using namespace std;
class A
{
public:
virtual void play()=0;
/*void run()
{
cout<<"A runing"<<endl;
}*/
};
class B:public A
{
public:
/*void play()
{
cout<<"B playing"<<endl;
}*/
};
class C:public A
{
public:
/*void play()
{
cout<<"C playing"<<endl;
}*/
};
int main()
{
//A *a=new B;
A a;
a.play();
return 0;
}
- 1
错误提示A是抽象类,play是纯虚函数
可以看出子类必须对纯虚函数进行实现
二、什么是抽象类
含有纯虚函数的类称为抽象类,它不能生成对象,而且只能是基类
抽象类为什么不能生成对象?
因为抽象类声明了纯虚函数,所以用户不能创建类的纯虚函数实例,只能创建它的派生类的实例
抽象类的作用
将有关的操作作为结果接口组织在一个继承层次结构中,由它为子类提供一个公共的根,子类将具体实现在其基类中作为接口的操作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <cmath>
#include <iostream>
using namespace std;
class A
{
public:
virtual void play()=0;
void run()
{
cout<<"A runing"<<endl;
}
};
class B:public A
{
public:
void play()
{
cout<<"B playing"<<endl;
}
};
class C:public A
{
public:
void play()
{
cout<<"C playing"<<endl;
}
};
int main()
{
A *b=new B;
b->play();
A *c=new C;
c->play();
return 0;
}
三、归纳ING
1.纯虚函数没有定义
2.纯虚函数是用来规范子类的行为,即接口
3.抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用
4.定义纯虚函数就是为了让基类不能实例化,因为实例化并没有意义
5.纯虚函数的引入更加安全:因为它避免了不小心没有去实现的问题,它会提醒子类去做相应的实现
6.纯虚函数的引入更加有效率:编码的效率会提升!
转载:http://blog.csdn.net/w_linux/article/details/70554828