含有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被实现,那么,它的派生类还是个抽象类。
含有存虚函数的类也就是抽象类!
当一个类要用做基类时,且其派生出的子类都有一个共性的成员函数,其中每个子类的函数用法都不一样;那么,就可以把该类定义为纯虚函数,也就是抽象类。定义为纯虚函数后,该类不可以再创建对象!
例如:
以一个形状类作为基类,其因为是基类,所以派生出的子类圆,长方形,正方形等会有共性的成员函数,假如该共性的成员函数基类中不实现,那么,就可以把它定义为纯虚函数,则该类就会变成抽象类。
把虚函数定义好不做任何具体实现
用法:纯虚函数,使用virtual和 =0
// 声明为纯虚函数
virtual float acreage() = 0;
1.某些类,在现实角度和项目实现角度,都不需要实例化(不需要创建它的对象)。
2.这个类中定义的某些成员函数,只是为了提供一个形式上的接口,准备让子类来做具体的实现。
3.此时,这个方法,就可以定义为“纯虚函数”, 包含纯虚函数的类,就称为抽象类。
代码:
#include
#include
using namespace std;
class Shape {
public:
Shape(string colour = "白") { this->colour = colour; }
// 声明为纯虚函数
virtual float acreage() = 0;
private:
string colour; // 颜色
};
// 因为没有实现acreage()函数,因此,该类依旧是抽象类
class Circle : public Shape {
public:
Circle(float radius=0.0, string colour="白") : Shape(colour) {
this->r = radius;
}
private:
float r; // 半径
};
int main(void) {
Shape s; // 错误,抽象类不能创建对象
Circle c; // 错误,抽象类不能创建对象
return 0;
}
由上面可以直到,在Circle类中,因为没有实现从抽象类中继承下来的acreage()纯虚函数,因此,Circle类也是抽象类。
那要如何修改呢?
只需要自己实现该纯虚函数后,Circle类就不会变成抽象类了。
// 实现从基类继承下来的纯虚函数
virtual float acreage() { return r * r * 3.14; }
#include
#include
using namespace std;
class Shape {
public:
Shape(string colour = "白") { this->colour = colour; }
// 声明为纯虚函数
virtual float acreage() = 0;
private:
string colour; // 颜色
};
class Circle : public Shape {
public:
Circle(float radius=0.0, string colour="白") : Shape(colour) {
this->r = radius;
}
// 实现从基类继承下来的纯虚函数
virtual float acreage() { return r * r * 3.14; }
private:
float r; // 半径
};
int main(void) {
Shape s; // 错误,抽象类不能创建对象
Circle c; // 可以创建对象
return 0;
}
父类声明某纯虚函数后,
那么它的子类,
1)要么实现这个纯虚函数 (最常见)
2)要么继续把这个纯虚函数声明为纯虚函数,这个子类也成为抽象类
3)要么不对这个纯虚函数做任何处理,等效于上一种情况(该方式不推荐)