C++ 学习笔记——C++纯虚函数和抽象类

C++纯虚函数

什么是纯虚函数

1,纯虚函数只有函数名、参数、返回值类型。

2,纯虚函数的定义是在函数句首使用 virtual 关键字修饰,并且在句末增加 "= 0"。

bash 复制代码
virtual void funtion() = 0;

3,纯虚函数只有声明,基类可以存在纯虚函数的实现(但无意义,因为子类都要重写)

4,定义纯虚函数的目的在于,使每一个派生类都拥有相同的函数规范。

5,C++中包含纯虚函数的类,被称为是"抽象类"。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。

6,C++中的纯虚函数更像是"只提供申明,没有实现",是对子类的约束,是"接口继承"。

7,C++中的纯虚函数也是一种"运行时多态"。

纯虚函数在基类或者父类中只有声明,没有实现,在子类中具体实现各自的逻辑。C++中包含纯虚函数的类,被称为是"抽象类"。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。

虚函数和纯虚函数的区别

  • 1、纯虚函数只有定义,没有实现;而虚函数既有定义,也有实现的代码。

  • 2、包含纯虚函数的类不能定义其对象,而包含虚函数的则可以。

纯虚函数的实际意义

纯虚函数只提供申明,没有实现,是对子类的约束,是"接口继承"。定义纯虚函数的目的在于,使每一个派生类都拥有相同的函数规范。

纯虚函数使用举例

c++ 复制代码
#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出对象。

抽象类具体有什么作用

抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化。

面向对象编程,必须有个对象,而基类一般都是很宽泛的一个概念,也没有必要去实例化,只有派生出的子类才有实际对象。

相关推荐
PandaCave1 分钟前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习
萝卜兽编程5 分钟前
优先级队列
c++·算法
yuwinter6 分钟前
鸿蒙HarmonyOS学习笔记(2)
笔记·学习·harmonyos
red_redemption28 分钟前
自由学习记录(23)
学习·unity·lua·ab包
幽兰的天空1 小时前
默语博主的推荐:探索技术世界的旅程
学习·程序人生·生活·美食·交友·美女·帅哥
游走于计算机中摆烂的1 小时前
启动前后端分离项目笔记
java·vue.js·笔记
珹洺1 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
孙同学要努力1 小时前
C++知识整理day1——前置基础知识整理(命名空间、输入输出、函数重载、引用)
开发语言·c++
沐泽Mu2 小时前
嵌入式学习-C嘎嘎-Day05
开发语言·c++·学习
几窗花鸢2 小时前
力扣面试经典 150(下)
数据结构·c++·算法·leetcode