当前位置: 首页 > news >正文

C++ 魔法三钥:解锁高效编程的封装、继承与多态

 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。

 


目录

💯前言

💯封装

1.封装概念

2.封装格式

3.封装的原理

4.封装的作用

💯继承

1.继承的概念

2.继承格式

3.继承的原理

4.继承的作用

💯多态

1.多态的概念

2.多态的格式

3.多态的原理

4.多态的作用

💯总结


💯前言


😖在 C++ 编程中,你是否曾对如何组织代码、实现代码复用以及处理不同对象的行为感到困惑?

😖你是否渴望深入理解一些核心概念,从而能够更加高效地构建复杂的程序呢?


👀如果你的答案是肯定的,那么 C++ 的三大特征 —— 封装、继承和多态,或许就是你一直在寻找的关键所在。

🙋这三个特征犹如三把神奇的钥匙,能够帮助我们打开高效编程的大门。

 


💯封装


🌠“如何保护数据的安全性和完整性,同时使代码的结构更加清晰呢

1.封装概念

  • 封装是将数据和操作数据的方法封装在一个类里面,并通过访问控制符来限制对类成员的访问。就像给它们穿上保护衣,只能通过特定接口访问修改数据。

2.封装格式

在类的定义中,通过privatepublicprotected等访问控制符来实现封装。例如:

class MyClass {
private:int privateData;
public:void setData(int value) {privateData = value;}int getData() {return privateData;}
};

 关于其具体的解释请观看我之前的文章👉【C++】类与对象基础概念解析

3.封装的原理


封装的核心原理是隐藏内部实现细节,只暴露必要的接口给外部。这样可以防止外部代码直接访问和修改类的内部数据,从而保证数据的安全性和一致性。同时,通过将相关的数据和操作放在一起,使代码的逻辑结构更加清晰,易于理解和维护。

 

4.封装的作用

  1. 保护数据安全,避免意外修改;
  2. 提高可维护性,修改内部不影响外部;
  3. 增强复用性,封装好的类可在不同项目使用。 

 📍以下是一个展示 C++ 封装特性的代码示例:📍

#include <iostream>
#include <string>// 定义一个名为Person的类,用于表示人的信息
class Person {
private:// 私有成员变量,用于存储人的姓名std::string name;// 私有成员变量,用于存储人的年龄int age;public:// 构造函数,用于初始化人的姓名和年龄Person(const std::string& name, int age) : name(name), age(age) {}// 获取姓名的函数,通过公共接口访问私有成员变量namestd::string getName() const { return name; }// 获取年龄的函数,通过公共接口访问私有成员变量ageint getAge() const { return age; }// 设置年龄的函数,通过公共接口修改私有成员变量agevoid setAge(int newAge) {if (newAge >= 0) {  // 进行简单的合法性检查age = newAge;} else {std::cerr << "年龄不能为负数" << std::endl;}}
};int main() {// 创建一个Person对象,传入姓名和年龄Person person("Alice", 25);// 通过公共接口获取并输出人的姓名和年龄std::cout << "姓名: " << person.getName() << ", 年龄: " << person.getAge() << std::endl;// 通过公共接口修改年龄person.setAge(26);// 再次获取并输出人的年龄std::cout << "新年龄: " << person.getAge() << std::endl;return 0;
}


💯继承


🌠“如何避免重复写相似代码,建立代码层次呢

1.继承的概念

😕一个类(派生类)能继承另一个类(基类)的属性和方法,并可扩展

2.继承格式

派生类定义中用:符号,后跟继承方式和基类名。例如:

class BaseClass {
public:void baseMethod() {// 基类方法实现}
};class DerivedClass : public BaseClass {
public:void derivedMethod() {// 派生类方法实现}
};

3.继承的原理

派生类继承基类非私有成员(继承方式会影响访问权限),就像孩子继承父母特质。

4.继承的作用

  1. 实现代码复用,提取共性放基类,派生类继承避免重复;
  2. 建立层次结构,清晰看到类派生关系;
  3. 方便扩展,添加新类可继承合适基类。

📍以下是一个展示 C++ 继承特性的代码示例:📍

#include <iostream>
#include <string>// 基类:动物类
class Animal {
public:// 动物类的构造函数,用于初始化动物的名称Animal(const std::string& name) : name(name) {}// 纯虚函数,用于表示动物发出声音的行为// 因为不同动物叫声不同,所以在基类中不给出具体实现virtual void makeSound() const = 0; // 获取动物名称的函数std::string getName() const { return name; }protected:// 动物的名称,受保护成员,派生类可以访问std::string name;
};// 派生类:猫类,继承自动物类
class Cat : public Animal {
public:// 猫类的构造函数,调用基类的构造函数初始化动物名称Cat(const std::string& name) : Animal(name) {}// 重写基类的纯虚函数,实现猫发出声音的行为void makeSound() const override {std::cout << name << " says Meow!" << std::endl;}
};// 派生类:狗类,继承自动物类
class Dog : public Animal {
public:// 狗类的构造函数,调用基类的构造函数初始化动物名称Dog(const std::string& name) : Animal(name) {}// 重写基类的纯虚函数,实现狗发出声音的行为void makeSound() const override {std::cout << name << " says Woof!" << std::endl;}
};int main() {// 创建一个猫对象,传入名称 "Kitty"Cat cat("Kitty");// 创建一个狗对象,传入名称 "Buddy"Dog dog("Buddy");// 调用猫对象的发出声音函数cat.makeSound();// 调用狗对象的发出声音函数dog.makeSound();return 0;
}

 


💯多态


🌠“怎样让同一操作在不同对象有不同效果,使程序更灵活呢?”

1.多态的概念

同一操作对不同对象有不同表现形式,C++ 中主要通过虚函数函数重载实现。

2.多态的格式

基类中定义虚函数(virtual 返回值类型 函数名(参数列表) = 0;纯虚函数或virtual 返回值类型 函数名(参数列表);普通虚函数),派生类中重写(返回值类型 函数名(参数列表) override;)。例如:

class Shape {
public:virtual void draw() = 0;
};class Circle : public Shape {
public:void draw() override {// 圆形绘制方法}
};class Rectangle : public Shape {
public:void draw() override {// 矩形绘制方法}
};

3.多态的原理

基于动态绑定,通过基类指针或引用调用虚函数时,运行时根据对象实际类型决定调用哪个派生类函数实现。

4.多态的作用

  1. 提高灵活性,处理不同对象用统一接口,自动选合适函数实现;
  2. 增强可维护性,添加新对象类型只需创建派生类实现虚函数;
  3. 实现通用性,可写通用代码适用于多种对象。

📍以下是一个展示 C++ 多态特性的代码示例:📍 

#include <iostream>// 基类:形状
class Shape {
public:// 纯虚函数,用于绘制形状,不同形状有不同的绘制方式virtual void draw() const = 0;
};// 派生类:圆形
class Circle : public Shape {
public:// 重写基类的纯虚函数,实现圆形的绘制方式void draw() const override {std::cout << "Drawing a circle." << std::endl;}
};// 派生类:矩形
class Rectangle : public Shape {
public:// 重写基类的纯虚函数,实现矩形的绘制方式void draw() const override {std::cout << "Drawing a rectangle." << std::endl;}
};// 函数接受基类指针,通过多态实现不同形状的绘制
void drawShape(const Shape* shape) {shape->draw();
}int main() {// 创建圆形对象Circle circle;// 创建矩形对象Rectangle rectangle;// 通过基类指针调用 drawShape 函数,实现多态drawShape(&circle);drawShape(&rectangle);return 0;
}


💯总结

🔥C++ 的封装、继承和多态是构建高效、灵活和可维护程序的重要基础。封装、继承和多态分别在数据安全、代码复用、程序灵活等方面发挥重要作用。

🚨学习完C++三大特性,我们来看以下代码:

 📍以下是一个综合展示 C++ 封装、继承和多态特性的代码示例:📍

#include <iostream>
#include <string>// 基类:动物类
class Animal {
protected:// 受保护的成员变量,用于存储动物的名字std::string name;
public:// 构造函数,初始化动物的名字Animal(const std::string& animalName) : name(animalName) {}// 纯虚函数,用于发出声音,不同动物有不同的实现virtual void makeSound() const = 0;// 获取动物名字的函数std::string getName() const { return name; }
};// 派生类:猫类
class Cat : public Animal {
public:// 构造函数,调用基类构造函数初始化名字Cat(const std::string& catName) : Animal(catName) {}// 重写纯虚函数,实现猫的声音void makeSound() const override {std::cout << name << " says Meow!" << std::endl;}
};// 派生类:狗类
class Dog : public Animal {
public:// 构造函数,调用基类构造函数初始化名字Dog(const std::string& dogName) : Animal(dogName) {}// 重写纯虚函数,实现狗的声音void makeSound() const override {std::cout << name << " says Woof!" << std::endl;}
};// 测试函数,接受基类指针,利用多态调用不同派生类的函数
void testAnimal(const Animal* animal) {animal->makeSound();
}int main() {// 创建猫对象Cat cat("Fluffy");// 创建狗对象Dog dog("Rex");// 通过基类指针调用测试函数,展示多态testAnimal(&cat);testAnimal(&dog);return 0;
}

 

在这个代码中:

  • 封装:在Animal类中,将成员变量name设为受保护的,外部不能直接访问,只能通过公共接口(如getName函数)来获取动物的名字,实现了封装。
  • 继承Cat类和Dog类都继承自Animal类,继承了基类的成员变量和函数,并且可以在派生类中添加自己特有的行为。
  • 多态:通过基类指针调用makeSound函数时,根据实际指向的对象类型(猫或狗),会自动调用相应派生类的重写函数,实现了多态。这样可以用统一的接口处理不同类型的对象。

 


 🎦以上就是本文的全部内容啦~

以后我将深入研究它们与其他 C++ 特性结合,解决更复杂编程问题! 

欢迎关注我👉【A Charmer】 

相关文章:

C++ 魔法三钥:解锁高效编程的封装、继承与多态

快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 &#x1f4af;前言 &#x1f4af;封装 1.封装概念 2.封装格式 3.封装的原理 4.封装的作用 &#x1f4af;继承 1.继承的概念 2.继承格式 3.继承的…...

姿态传感器(学习笔记上)

上节我们学的是温湿传感器&#xff0c;这节我们学的是姿态传感器&#xff0c;虽然都是传感器&#xff0c;但是它们还是有很大的区别的&#xff0c;这节的传感器我们通过学习可知&#xff0c;开发板上的姿态传感器型号是QMI8658C&#xff0c;内部集成3轴加速度传感器和3轴陀螺仪…...

labelimg使用教程

快捷键 W&#xff1a;调出标注的十字架&#xff0c;开始标注 A&#xff1a;切换到上一张图片 D&#xff1a;切换到下一张图片 del&#xff1a;删除标注的矩形框 CtrlS&#xff1a;保存标注好的标签 Ctrl鼠标滚轮&#xff1a;按住Ctrl&#xff0c;然后滚动鼠标滚轮&#xff0c;…...

力扣21 : 合并两个有序链表

链表style 描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 节点大小相同时&#xff0c;l1的节点在前 何解&#xff1f; 1&#xff0c;遍历两个链表&#xff0c;挨个比较节点大小 同时遍…...

【Spring】Spring Boot 配置文件(7)

本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 有什么不懂的都可以问我&#xff0c;看到消息会回复的&#xff0c;可能会不及时&#xff0c;请见谅&#xff01;&#xff01; 1、配置文件作…...

《向量数据库指南》——解锁Wikipedia文章向量的跨语言搜索秘籍

嘿,各位向量数据库和AI应用的小伙伴们,我是你们的老朋友王帅旭,大禹智库的向量数据库高级研究员,也是《向量数据库指南》的作者。今天,咱们来聊聊一个超棒的数据集——百万条 Wikipedia 文章向量,这可是我在研究过程中发现的一个宝藏啊! 首先,咱们得说说这个数据集的来…...

【力扣 + 牛客 | SQL题 | 每日5题】牛客SQL热题204,201,215

1. 力扣1126&#xff1a;查询活跃业务 1.1 题目&#xff1a; 事件表&#xff1a;Events ------------------------ | Column Name | Type | ------------------------ | business_id | int | | event_type | varchar | | occurrences | int | --------…...

下载数据集用于图像分类并自动分为训练集和测试集方法

一、背景 最近需要用Vision Transformer&#xff08;ViT&#xff09;完成图像分类任务&#xff0c;因此查到了WZMIAOMIAO的GitHub&#xff0c;里面有各种图像处理的方法。而图像处理的前期工作就是获取大量的数据集&#xff0c;用于训练模型参数&#xff0c;以准确识别或分类我…...

Python xlrd库介绍

一、简介 xlrd是一个用于读取Excel文件(.xls和.xlsx格式)的Python库。它提供了一系列函数来访问Excel文件中的数据&#xff0c;如读取工作表、单元格的值等。 二、安装 可以使用以下命令安装xlrd库&#xff1a; pip install xlrd 三、使用方法 1. 导入库&#xff1a; 示例…...

Javascript立即执行函数

//立即执行函数 把函数的声明看作一个整体声明结束就立即调用 // (function(){console.log(hello) // })(); console.log((function (){ return 0; })()); // let afunction(){ console.log(hello) }; console.log(typeof a);//function,数组&#xff1a;objeck...

Linux相关概念和易错知识点(17)(文件、文件的系统调用接口、C语言标准流)

目录 1.文件 &#xff08;1&#xff09;文件组成和访问 &#xff08;2&#xff09;文件的管理 &#xff08;3&#xff09;C语言标准流 &#xff08;4&#xff09;struct file ①文件操作表 ②文件内核缓冲区 &#xff08;5&#xff09;Linux下一切皆文件 &#xff08;…...

三防加固工业平板国产化的现状与展望

在当今全球科技竞争日益激烈的背景下&#xff0c;工业4.0和智能制造的浪潮推动了工业自动化设备的迅速发展&#xff0c;其中&#xff0c;三防加固工业平板电脑作为连接物理世界与数字世界的桥梁&#xff0c;其重要性不言而喻。所谓“三防”&#xff0c;即防水、防尘、防震&…...

3.1.3 看对于“肮脏”页面的处理

3.1.3 看对于“肮脏”页面的处理 文章目录 3.1.3 看对于“肮脏”页面的处理再看对于“肮脏”页面的处理MmPageOutVirtualMemory() 再看对于“肮脏”页面的处理 MmPageOutVirtualMemory() NTSTATUS NTAPI MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace,PMEMORY_AREA Me…...

学 Python 还是学 Java?——来自程序员的世纪困惑!

文章目录 1. Python&#xff1a;我就是简单&#xff0c;so what&#xff1f;2. Java&#xff1a;严谨到让你头疼&#xff0c;但大佬都在用&#xff01;3. 到底谁更香&#xff1f;——关于学哪门语言的百思不得姐结论——到底该选谁&#xff1f;推荐阅读文章 每个程序员都可能面…...

Spring Web MVC 入门

1. 什么是 Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从从⼀开始就包含在Spring框架中。它的 正式名称“SpringWebMVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC". 什么是Servlet呢? Ser…...

吃牛羊肉的季节来了,快来看看怎么陈列与销售!

一、肉品陈列基本原则 (一&#xff09;新鲜卫生 1、保证商品在正确的温度、正确的方式下陈列 (1&#xff09;正确的温度&#xff1a;冷藏柜-2℃&#xff0d;2℃&#xff1b;冷冻柜库-20℃&#xff0d;18℃ (2&#xff09;正确的方式&#xff1a; 商品不遮挡冷气出风口&…...

租房业务全流程管理:Spring Boot系统应用

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了租房管理系统的开发全过程。通过分析租房管理系统管理的不足&#xff0c;创建了一个计算机管理租房管理系统的方案。文章介绍了租房管理系统的系统分析部分&…...

GCC之编译(7)Linker链接脚本

GCC之(7)Linker链接脚本 Author: Once Day Date: 2024年10月25日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 本文档翻译自GNU LD链接脚本官方手册 参考文章: GNU LD …...

【设计模式系列】适配器模式(九)

目录 一、什么是适配器模式 二、适配器模式的角色 三、适配器模式的典型应用 四、适配器模式在InputStreamReader中的应用 一、什么是适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将不兼容的接口转换为一个客户端…...

C# 文档打印详解与示例

文章目录 一、概述二、PrintDocument 类的使用三、PrintDialog 类的使用四、PageSetupDialog 类的使用五、PrintPreviewDialog 类的使用六、完整示例七、总结 在软件开发过程中&#xff0c;文档打印是一个常见的功能需求。本文将详细介绍如何在C#中实现文档打印&#xff0c;并给…...

Spring Cloud --- Sentinel 熔断规则

熔断规则 慢调用比例 发送10个请求&#xff0c;每个请求理想响应时长为200毫秒。统计1秒钟&#xff0c;如果10个请求响应时间超过200毫秒的比例大于等于10%&#xff0c;则触发熔断&#xff0c;熔断5秒。 异常比例 1秒内&#xff0c;发送请求出现异常率为20%&#xff0c;则触…...

使用爬虫爬取Python中文开发者社区基础教程的数据

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

你了解kafka消息队列么?

消息队列概述 一. 消息队列组件二. 消息队列通信模式2.1 点对点模式2.2 发布/订阅模式 三. 消息队列的优缺点3.1 消息队列的优点3.2 消息队列的缺点 四. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&…...

力扣102 二叉树的层序遍历 广度优先搜索

二叉树的层序遍历 题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15…...

堆(堆排序,TOP K, 优先级队列)

1 概念解释 堆的定义&#xff1a;堆是一颗完全二叉树&#xff0c;分为大堆和小堆 大堆&#xff1a;一棵树中&#xff0c;任何父亲节点都大于等于孩子的节点&#xff0c;大堆的根结点最大 小堆&#xff1a;一棵树中&#xff0c;任何父亲节点都小于等于孩子节点&#xff0c;小堆…...

(三)行为模式:11、模板模式(Template Pattern)(C++示例)

目录 1、模板模式含义 2、模板模式的UML图学习 3、模板模式的应用场景 4、模板模式的优缺点 5、C实现的实例 1、模板模式含义 模板模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将某些步骤…...

贝叶斯中的充分统计量

内容来源 贝叶斯统计&#xff08;第二版&#xff09;中国统计出版社 前两篇笔记简述经典统计中的充分统计量和判断充分统计量的 N e y m a n Neyman Neyman 因子分解定理 而在贝叶斯统计中&#xff0c;充分统计量也有一个充要条件 定理兼定义 设 x ( x 1 , x 2 , ⋯ , x …...

012:ArcGIS Server 10.2安装与站点创建教程

摘要&#xff1a;本文详细介绍地理信息系统服务器软件ArcGIS Server 10.2的安装与站点创建流程。 一、软件介绍 ArcGIS Server 10.2是Esri公司开发的一款强大的地理信息系统&#xff08;GIS&#xff09;服务器软件。它支持发布和共享地图、地理数据处理服务及空间分析功能&…...

xlive.dll错误的详细解决办法步骤教程,xlive.dll基本状况介绍

在计算机的众多文件中&#xff0c;“xlive.dll”扮演着独特而重要的角色。所以当你的电脑丢失了xlive.dll文件时&#xff0c;会倒是电脑不能正常运行&#xff0c;那么出现这样的问题有什么办法可以将丢失的xlive.dll进行修复呢&#xff1f;今天这篇文章将和大家聊聊xlive.dll错…...

通俗易懂的餐厅例子来讲解JVM

餐厅版本 JVM&#xff08;Java虚拟机&#xff09;可以想象成一个虚拟的计算机&#xff0c;它能够运行Java程序。为了让你更容易理解&#xff0c;我们可以用一个餐厅的比喻来解释JVM&#xff1a; 菜单&#xff08;Java源代码&#xff09;&#xff1a; 想象一下&#xff0c;Java…...

做电影网站犯罪吗/镇江seo优化

bind 一句话介绍 bind: bind() 方法会创建一个新函数。当这个新函数被调用时&#xff0c;bind() 的第一个参数将作为它运行时的 this&#xff0c;之后的一序列参数将会在传递的实参前传入作为它的参数。(来自于 MDN ) 由此我们可以首先得出 bind 函数的两个特点&#xff1a; 返…...

大连网龙建站优化推广/网店如何营销推广

更多代码请见&#xff1a;https://github.com/xubo245 基因数据处理系列 1.解释 重新运行&#xff0c;跟换了文件地址 后来终端&#xff0c;需要运行其他的2.代码&#xff1a; hadoopMaster:~/disk2/xubo/project/alignment/sparkBWA$ vi sparkBWA.sh for j in 10000 10000…...

建设网站最简单的软件是/今日新闻事件

原文链接 最近用Vue Tone.js做了一款钢琴类web应用&#xff0c;名字定为自由钢琴&#xff08;AutoPiano&#xff09;&#xff0c;人生如音乐&#xff0c;欢快且自由。 此文权当作该项目的总结和分享~ 项目简介 自由钢琴&#xff08;AutoPiano&#xff09;是利用HTML5技术开发的…...

湖南湘信建设工程有限公司网站/sem论坛

在大量的面试中&#xff0c;红黑树包括某种AVL树 这些概念只会用即可&#xff0c;代码细节可以不做要求&#xff0c;要知道原理。 搜索二叉树 搜索二叉树的定义&#xff1a;对于一棵二叉树中的任意子树&#xff0c;其左子树上的所有数值小于头结点的数值&#xff0c;其右子树…...

去国外政府网站做轮胎认证/杭州百度

本文为德国弗里恩大学&#xff08;作者&#xff1a;ChristianDamm&#xff09;的硕士论文&#xff0c;共54页。 随着自动驾驶车辆的不断普及&#xff0c;避障等挑战变得越来越重要。为了实现避障&#xff0c;可靠的障碍物检测是前提条件之一。虽然普通的自动驾驶车辆主要使用相…...

移动网站优化 sousuoyouhua.com/百度推广代运营

1、watch深度监听 watch主要用于监听页面值的变化&#xff0c;watch前后&#xff08;newValue和oldValue&#xff09;值一样的情况下&#xff0c;app监听不会被调用&#xff0c;H5会被调用。 export default {props: {isTag: {type: Boolean,default: true}},watch: {// newV…...