纯虚函数格式:
virtual 函数类型 函数名(参数列表)=0;
- eg:virtual float area() const {return 0;}
- 或:virtual float area() const =0;
抽象函数定义:
- 如果声明了一类,一般可以用它定义对象,但是在面向对象程序设计中,他们不用生成对象,
- 定义这些类的唯一目的是用它作为基类去建立派生类。
- 凡是包含纯虚函数的类都是抽象类,因为纯虚函数不能被调用的,包含纯虚函数的类是无法建立对象的。
- 抽象类的作用是作为一个类族的共同基类,后者说,为一个类族提供一个共接口。
- 如果在抽象类所派生出的新类中欧对基类的所有纯虚函数进行了定义,那么这些函数就被赋予可功能,可以被调用,
- 这个派生类就不是抽象类,而是可以用来定义的对象的具体类。
- 如果在派生类中没有对所有纯虚函数进行定义,则这派生类仍然是抽象类,不能定义对象
总结:
- 抽象类,在派生类中纯虚函数一定要重新定义虚函数;
- 也可以是无论什么虚函数,只要要用时就重新定义就行;
- 包含纯虚函数的类一定是抽象类;
- 抽象类不能定义对象;
- 抽象类可以定义指针指向抽象类数据的指针变量,
- 当派生类成为具体类之后,可以用这种指针指向派生类对象,
- 让后通过该指针调用虚函数,实现堕胎性操作;
#include <iostream>
using namespace std;
//称明抽象类基类Shape
class shape
{
public:
virtual float area()const
{
return 0.0; //虚函数
}
virtual float volume() const
{
return 0.0; //虚函数
}
virtual void shapeName()const=0;//纯虚函数
};
//声明point类成员函数
class point:public shape
{
public:
point(float=0,float=0);//声明构造函数
void setpoint(float,float);//设置y坐标
float getX() const
{
return x;
}
float getY() const
{
return y;
}
virtual void shapeName()const
{
cout<<"point:"; //对虚函数进行在定义
}
friend ostream & operator<< (ostream &,const point &); //运算符重载
protected:
float x;
float y;
};
//定义point成员函数
point::point(float a,float b)
{
x=a;
y=b;
}
void point::setpoint(float a,float b)
{
x=a;
y=b;
}
ostream & operator <<(ostream &output,const point &p)
{
output<<"["<<p.x<<","<<p.y<<"]"<<endl;
return output;
}
class circle:public point
{
public:
circle(float x=0,float y=0,float r=0);
void setRadius(float);
float getRadius() const;
virtual float area() const;
virtual void shapeName()const
{
cout<<"circle:"; //对虚函数进行在定义
}
friend ostream &operator<<(ostream &,const circle &);
protected:
float radius;
};
circle::circle(float a,float b,float r):point(a,b),radius(r) {}
void circle::setRadius(float r)
{
radius=r;
}
float circle::getRadius() const
{
return radius;
}
float circle::area() const
{
return 3.14*radius*radius;
}
ostream &operator<<(ostream &output,const circle &c)
{
output<<"["<<c.x<<","<<c.y<<"]"<<" r="<<c.radius;
return output;
}
int main()
{
point p(3.2,4.5);
circle c(2.4,1.2,5.6);
p.shapeName();//用对象建立静态关联
cout<<p<<endl;//输出点的数据
c.shapeName();//静态关联
cout<<c<<endl;//输出圆的数据,这里我用了函数的重载,直接输出他的对象
cout<<endl;
shape *pt;
pt=&p;//使指针指point类对象
pt->shapeName();//用指针建立动态关联
cout<<"x="<<p.getX()<<",y="<<p.getY()<<"\narea="<<pt->area()<<"\nvolime="<<pt->volume()<<endl;
cout<<endl;
pt=&c;
pt->shapeName();
cout<<"x="<<c.getX()<<",y="<<c.getY()<<"\narea="<<pt->area()<<"\nvolime="<<pt->volume()<<endl;
return 0;
}
结果: