纯虚函数格式: virtual void draw() =0;
纯虚函数没有实现体,含有纯虚函数的类,称为抽象基类,抽象基类不可以实例化(注意:这里是抽象基类,在多继承那里的虚继承才是虚基类)
在java中被称作interface 接口(在java中抽象基类),作用是给族类提供接口
例子:
class Shape
{
public:
Shape(int xx,int yy)
:_x(xx),_y(yy) {}
virtual void draw()=0;
protected:
int _x,_y;
};
void Shape::draw()
{
cout<<"draw from"<<"("<<_x<<","<<_y<<")"<<endl;
}
class Rect:public Shape
{
public:
Rect(int x,int y,int len,int wid)
:Shape(x,y),_len(len),_wid(wid)
{
}
virtual void draw()//覆写
{
cout<<"start from"<<"("<<_x<<","<<_y<<")";
cout<<" len="<<_len<<" wid="<<_wid<<endl;
}
private:
int _len,_wid;
};
class Circle:public Shape
{
public:
Circle(int x,int y ,int r)
:Shape(x,y),_radius(r){}
virtual void draw()//覆写
{
cout<<"start from"<<"("<<_x<<","<<_y<<")";
cout<<" radius="<<_radius<<endl;
}
private:
int _radius;
};
int main()
{
//Shape s(1,1); //error 不可以实例化
Circle c(1,2,3);
Shape *ps=&c; //子类可以实例化,只是父类不可以,提供一个接口
ps->draw();
Rect r(3,4,5,6);
ps=&r;
ps->draw();
return 0;
}
小结:
1.含有纯虚函数的类,称为抽象基类,不可实例化。即不能创建对象,存在的意义就是被继承,提供族类的公共接口,java中称为interface。
2.纯虚函数只有声明,没有实现,被“初始化”为 0 。
3.如果一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数,派生类仍然为纯虚基类。