-
纯虚函数:没有函数体,只有函数声明
-
抽象类:包含纯虚函数的类
- 之所以说它抽象,是因为它无法实例化,也就是无法创建对象。
- 纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。
- 抽象类通常是作为基类,让派生类去实现纯虚函数,派生类必须实现纯虚函数才能被实例化。
#include <iostream> using namespace std; //线 //Line是抽象类,也是最顶层的基类 class Line{ public: Line(float len); //构造函数 virtual float area() = 0; virtual float volume() = 0; protected: float m_len; }; Line::Line(float len): m_len(len){ } //矩形 //实现了area()函数(就是定义了纯虚函数的函数体)。没有实现纯虚函数volume(),Rec仍然是抽象类 class Rec: public Line{ public: Rec(float len, float width); //构造函数 float area(); protected: float m_width; }; Rec::Rec(float len, float width): Line(len), m_width(width){ } float Rec::area(){ return m_len * m_width; } //长方体 //不是抽象类,可以被实例化 class Cuboid: public Rec{ public: Cuboid(float len, float width, float height); //构造函数 float area(); float volume(); protected: float m_height; }; Cuboid::Cuboid(float len, float width, float height): Rec(len, width), m_height(height){ } float Cuboid::area(){ return 2 * ( m_len*m_width + m_len*m_height + m_width*m_height); } float Cuboid::volume(){ return m_len * m_width * m_height; } //正方体 class Cube: public Cuboid{ public: Cube(float len); //构造函数 float area(); float volume(); }; Cube::Cube(float len): Cuboid(len, len, len){ } float Cube::area(){ return 6 * m_len * m_len; } float Cube::volume(){ return m_len * m_len * m_len; } //继承关系:Line --> Rec --> Cuboid --> Cube int main(){ Line *p = new Cuboid(10, 20, 30); //基类指针指向派生类Cuboid cout<<"The area of Cuboid is "<<p->area()<<endl; cout<<"The volume of Cuboid is "<<p->volume()<<endl; p = new Cube(15); //基类指针指向Cube cout<<"The area of Cube is "<<p->area()<<endl; cout<<"The volume of Cube is "<<p->volume()<<endl; return 0; }
/*运行结果:*/ The area of Cuboid is 2200 The volume of Cuboid is 6000 The area of Cube is 1350 The volume of Cube is 3375
-
纯虚函数的主要目的:
- 抽象类处了约束派生类的功能,还可以实现多态。
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)