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.hqwc.cn/news/233918.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

juniper EX系列交换机 CLI命令行操作模式

JUNOS有两种模式&#xff1a;操作模式和配置模式。 1&#xff0c;操作模式 监控和排错 软件&#xff0c;网络连接、路由器硬件。 2&#xff0c;配置模式 testlab2> 配置路由器包括&#xff1a;interface、路由信息、路由协议、用户访问、系统硬件参数。 testlab2> …

Android笔记(十六):前台服务

设置服务为前台服务。前台服务会在状态栏显示一个通知。通知界面与服务进行关联。 一、什么是通知&#xff1f; Notification通知是在移动应用APP提供给用户的消息提示&#xff0c;是在移动系统的通知栏中显示。当移动应用不在运行时或者在后台状态下&#xff0c;通过发布通知…

2023-简单点-树莓派的config.txt文件解析

config.txt文件解析 注意事项什么时候去读取这个配置文件呢&#xff1f;如何查看配置情况&#xff1f;举例某些常见参数常见硬件参数camera_auto_detectdisplay_auto_detect dtparamarm_boost (Raspberry Pi 4 Only)start_file, fixup_filecmdlinearm_64bitotg_mode (Raspberry…

【小白进阶】Linux 调试大法——gdb

初衷 gdb调试是每一个后端开发工程师所必备的技能&#xff0c;我们工作总是会用gdb协助我们去分析和调试问题。但是大部分同学的技能仅停留在最基础的查看问题。即gdb program -->r --> 问题复现 --> bt 查看源码中的哪一行出现了错误。再稍微熟练点的&#xff0c;可能…

Kali 修改IP地址和DNS 开启SSH和远程桌面

一、修和IP和DNS 1、打开配置文件 vim /etc/network/interfaces# 加入 auto eth0 iface eth0 inet static address 10.3.0.231 netmask 255.255.255.0 gateway 10.3.0.12、取消IP地址 ip addr flush dev eth0 3、配置DNS vim /etc/resolv.confnameserver 114.114.114.114 …

uniapp 使用web-view外接三方

来源 前阵子有个需求是需要在原有的项目上加入一个电子签名的功能&#xff0c;为了兼容性和复用性后面解决方法是将这个电子签名写在一个新的项目中&#xff0c;然后原有的项目使用web-view接入这个电子签名项目&#xff1b; 最近又有一个需求&#xff0c;是需要接入第三方的…

【C++】C++11

一、C11 简介 C11 - cppreference.com 在 2003 年 C 标准委员会曾经提交了一份技术勘误表&#xff08;简称TC1&#xff09;&#xff0c;使得 C03 这个名字已经取代了 C98 称为 C11 之前的最新 C 标准名称。不过由于 C03&#xff08;TC1&#xff09;主要是对 C98 标准中的漏洞进…

前馈全连接层

B站教学视频链接&#xff1a;2.3.4前馈全连接层-part2_哔哩哔哩_bilibili

渗透测试-环境部署

环境部署 一、kali的环境部署二、DNSenum工具&#xff1a;深入挖掘目标域名的DNS信息三、安装Burpsuite四、安装根证书五、JSFinder的使用六、App、小程序、公众号提取 一、kali的环境部署 1.配置SSH 修改配置文件 vi /etc/ssh/sshd_config 找到 # PermitRootLogin prohibit…

应用场景丨智慧社区怎么有效预警内涝积水灾害

在繁华的社区中&#xff0c;一场突如其来的暴雨可能会让整个社区陷入“水深火热”。面对这样的困境&#xff0c;社区内涝积水监测系统应运而生&#xff0c;成为社区生命线的重要守护者。 社区内涝积水监测系统是一套高科技预警机制&#xff0c;它运用传感器、数据采集器、通信网…

java开发之个微群聊自动添加好友

请求URL&#xff1a; http://域名/addRoomMemberFriend 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRoom…

Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)

目录 Node.js 文件系统模块&#xff08;二&#xff09; Node.js 文件系统模块&#xff08;三&#xff09; Node.js 文件系统模块&#xff08;四&#xff09; Node.js 路径模块 Node.js 连接 MySQL Node.js nodemon Node.js 操作 MySQL Node.js 应用 Node.js 文件系统模块…