C++纯虚函数
什么是纯虚函数
1,纯虚函数只有函数名、参数、返回值类型。
2,纯虚函数的定义是在函数句首使用 virtual 关键字修饰,并且在句末增加 “= 0”。
virtual void funtion() = 0;
3,纯虚函数只有声明,基类可以存在纯虚函数的实现(但无意义,因为子类都要重写)
4,定义纯虚函数的目的在于,使每一个派生类都拥有相同的函数规范。
5,C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。
6,C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。
7,C++中的纯虚函数也是一种“运行时多态”。
纯虚函数在基类或者父类中只有声明,没有实现,在子类中具体实现各自的逻辑。C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。
虚函数和纯虚函数的区别
-
1、纯虚函数只有定义,没有实现;而虚函数既有定义,也有实现的代码。
-
2、包含纯虚函数的类不能定义其对象,而包含虚函数的则可以。
纯虚函数的实际意义
纯虚函数只提供申明,没有实现,是对子类的约束,是“接口继承”。定义纯虚函数的目的在于,使每一个派生类都拥有相同的函数规范。
纯虚函数使用举例
#include <iostream>
using namespace std;
// 线
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) {}
// 矩形
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;
}
int main()
{
Line *p = new Cuboid(10, 20, 30);
cout << "The area of Cuboid is " << p->area() << endl;
cout << "The volume of Cuboid is " << p->volume() << endl;
p = new Cube(15);
cout << "The area of Cube is " << p->area() << endl;
cout << "The volume of Cube is " << p->volume() << endl;
return 0;
}
这段代码展示了一个简单的继承和多态的例子,用于计算不同几何形状(线、矩形、长方体、正方体)的面积和体积。下面逐个解释每个部分的含义:
Line类:
这是一个基类,表示一条线。它有一个构造函数Line(float len),用于初始化线的长度。该类定义了两个纯虚函数area()和volume(),分别用于计算面积和体积。这意味着Line类是一个抽象类,不能被实例化。它有一个保护成员变量m_len,表示线的长度。
Rec类:
这是Line类的派生类,表示一个矩形。它有一个构造函数Rec(float len, float width),用于初始化矩形的长度和宽度。它重写了基类的area()函数,计算矩形的面积。它有一个保护成员变量m_width,表示矩形的宽度。
Cuboid类:
这是Rec类的派生类,表示一个长方体。它有一个构造函数Cuboid(float len, float width, float height),用于初始化长方体的长度、宽度和高度。它重写了基类的area()和volume()函数,分别计算长方体的表面积和体积。它有一个保护成员变量m_height,表示长方体的高度。
Cube类:
这是Cuboid类的派生类,表示一个正方体。它有一个构造函数Cube(float len),用于初始化正方体的边长。它重写了基类的area()和volume()函数,分别计算正方体的表面积和体积。
在main()函数中,通过基类指针Line* p来实现多态性。首先,创建一个指向Cuboid对象的指针,调用area()和volume()函数计算长方体的表面积和体积,并输出结果。然后,将指针重新指向一个Cube对象,再次调用area()和volume()函数计算正方体的表面积和体积,并输出结果。
通过使用继承和多态,可以方便地计算不同几何形状的面积和体积,同时实现了代码的重用和灵活性。
C++抽象类
什么是C++ 抽象类
C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能生成(new出)对象,只有实现了这个纯虚函数的子类才能new出对象。
抽象类具体有什么作用
抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化。
面向对象编程,必须有个对象,而基类一般都是很宽泛的一个概念,也没有必要去实例化,只有派生出的子类才有实际对象。