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

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出对象。

抽象类具体有什么作用

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/213713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM 开发模式 RAG,MRKL,Re-Act,Plan-Execute 模式对比

本心、输入输出、结果 文章目录 LLM 开发模式 RAG&#xff0c;MRKL&#xff0c;Re-Act&#xff0c;Plan-Execute 模式对比前言RAG、MRKL、Re-Act和Plan-Execute模式的一些对比花有重开日&#xff0c;人无再少年实践是检验真理的唯一标准 LLM 开发模式 RAG&#xff0c;MRKL&…

JVM:强软弱虚四种引用

下面依次解释五种引用 一、强引用 把一个对象赋值给一个引用变量&#xff0c;就相当于把这个对象的强引用放到变量中。 只要对象可达&#xff0c; GC一定不会回收这个对象&#xff08;A1&#xff09; 二、软引用 当一个对象&#xff08;A2&#xff09;没有强引用时&#xff…

图文并茂教你模拟302接口,实现js中axios,fetch遇到302状态码后跳转的多种方案axios,fetch成功响应拦截302

前情提要 日常工作中&#xff0c;我们会使用fetch,或者axios发起请求来获取数据&#xff0c;但是当我们遇到一些特殊需求的时候&#xff0c;使用不同库之后&#xff0c;会得到不同的结果&#xff0c;例如302,308的状态码&#xff0c;那么我们应该怎么处理这两种情况呢&#xf…

C语言练习题

C语言练习题 文章目录 C语言练习题题目一题目二题目三题目四题目五题目六题目八 题目一 #include <stdio.h> //VS2022,默认对齐数为8字节 union Un {short s[7];int n; };int main() {printf("%zd", sizeof(union Un));return 0; }代码运行结果:> 16 sizeo…

Springboot依赖注入时重复初始化Bean的问题

前言 最近做项目&#xff0c;发现了springboot2.7.x在参数initiate的时候可以反复初始化&#xff0c;而且首次异常后&#xff0c;第二次成功居然也可以启动&#xff0c;通过查看源代码发现了问题根源&#xff0c;且在springboot高版本3.x&#xff0c;就出现了了Configuration的…

pytorch 中的dim 的作用范围

1. 二维矩阵时 不同的运算&#xff0c; dim 的作用域都是一样的思想&#xff1b; 当数据是二维矩阵时&#xff0c; 可以按照下面的思想理解&#xff1a; 对于矩阵&#xff1a; dim0 按列操作&#xff08;沿列向下&#xff09;。 dim1 按行操作&#xff08;跨行&#xff09;。 …

JavaSE学习路线及经验所谈

前言 一.学习框架二.学习经验 相信很多小白刚开始学习Java时&#xff0c;都是靠自己在网上搜集资料&#xff0c;并没有明确规划&#xff0c;不知道要学习什么内容&#xff0c;也不知道学习的重点是什么&#xff0c;那么这篇文章会给你一个大致的指引&#xff0c;当然也可以作为…

【力扣】——可获得的最大点数(滑动窗口)

几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#xff0c;最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你一个整数数组 cardPoi…

深度学习 第3章 Python程序设计语言(3.2 Python程序流程控制)

无论是在机器学习还是深度学习中&#xff0c;Python已经成为主导性的编程语言。而且&#xff0c;现在许多主流的深度学习框架&#xff0c;例如PyTorch、TensorFlow也都是基于Python。本课程主要是围绕“理论实战”同时进行&#xff0c;所以本章将重点介绍深度学习中Python的必备…

探秘Python FastAPI、Sanic、Tornado 与Golang Gin性能之战!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python和Golang作为两种流行的编程语言&#xff0c;都拥有强大的异步框架&#xff0c;为开发者提供了在构建高性能应用时的选择。在Python阵营中&#xff0c;FastAPI、Sanic、Tornado等框架因其异步特性和高效的…

React18 入门与进阶

React18 入门与进阶 前言一、核心概念与类组件使用1、虚拟DOM与新的渲染写法2、JSX 与 JSX 的使用3、类组件和函数组件4、类组件与类组件通信5、props详解与注意事项6、类组件中事件的使用7、类组件响应式数据实现与原理8、PureComponent 与 shouldComponentUpdate9、immutable…

数据结构之堆排序以及Top-k问题详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力 目录 1.前言 2.堆排序 2.1降序排序 2.2时间复杂…

领域驱动架构(DDD)建模

一、背景 常见的软件开发方式是拿到产品需求后&#xff0c;直接考虑数据库中表应该如何设计&#xff0c;这种方式已经将设计与业务需求脱节&#xff0c;而更多的是直接考虑应该如何实现了&#xff0c;这有点本末倒置。而DDD是从领域(问题域)为出发点进行的设计方法。 领域驱动…

JSP格式化标签 parseDate将指定时间格式字符串转为真正的date对象

格式化标签最后一个就是 parseDate 作用 将一个日期/时间格式字符串 转为 真正的date时间类型 有点无语 这种 东西应该都是在java中去做的 而不是在java中 这个建议也是做个了解即可 作用不是那么大 基本语法如下 这里 我们 直接编写代码如下 <% page contentType"…

【Linux服务器Java环境搭建】附录01:判断Linux服务器是X64还是arm架构的方式

【Linux服务器Java环境搭建】01购买云服务器以及在服务器中安装Linux系统 【Linux服务器Java环境搭建】02 通过xftp和xshell远程连接云服务器 【Linux服务器Java环境搭建】03 Git工具安装 【Linux服务器Java环境搭建】04 JDK安装&#xff08;JAVA环境安装&#xff09; 【Linux服…

测试基础知识

常见测试分类 按测试阶段划分&#xff1a; 单元测试&#xff1a;针对程序源码进行测试。&#xff08;国内是开发自测&#xff09;集成测试&#xff1a;又称接口测试&#xff0c;针对模块间的访问地址进行测试。系统测试&#xff1a;对整个系统进行测试&#xff0c;包括功能、兼…

手写实现一个动态代理框架

手写实现一个动态代理框架 什么是代理模式什么是动态代理动态代理中的编译、类加载与对象实例化手写实现一个动态代理框架实现细节DynamicProxyHandlerProxy生成代码写入代码到磁盘文件调用编译器进行编译调用类加载器进行类加载反射实例化删除前面生成的java文件和class文件 C…

基于springboot实现智能停车场管理平台

一、系统架构 前端&#xff1a;vue | echarts | html | layui 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 控制台 03. 停车场管理-停车场管理 04. 停车场管理-停车场区…

leetcode 15. 三数之和(优质解法)

代码&#xff1a; class Solution {public static List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> listsnew ArrayList<>();int lengthnums.length;for(int i0;i<length-3;){int lefti1;int rightlength…

每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)

每日一题系列&#xff08;day 11&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…
最新文章