--虚函数:在基类的函数声明前加关键字virtual表明该函数是一个虚函数,当派生类重新定义此函数的功能时,应保证函数的声明高度一致,否则会被编译器误认为是重载函数,并不需要再加关键字。当派生类的对象调用该函数时,先看该虚函数有没有在该派生类中实现,有则调用,无则调用基类中的函数定义:
class shape{
protected:
double x,y;
public:
shape(double xx,double yy):x(xx),y(yy);
virtual double area() const {return 0.0;} //在基类中定义了一个计算面积的虚函数
};
class rectangle:public shape{
protected:
double w,h;
public:
rectangle(double xx,double yy,double ww,double hh):shape(xx,yy),w(ww),h(hh);
double area() const {return w*h;} //area()虚函数的实现,声明和基类中的完全一致
}
...
shape a;
rectangle b;
那么a.area()=0.0,而b.area()=b.w*b.h;
虚析构函数
如果派生类新增了指针对象,指向了动态申请的内存,那么必须定义虚构函数来释放这块内存空间。如果根类的析构函数是虚构函数,所有派生类的析构函数都将是虚函数。
纯虚函数
格式:virtual double area()const =0;这样就不用为虚类写一个无用的函数体。一个类含有纯虚函数就可以被称为抽象类。