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】 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序中积分使用价值的拓展策略

摘要&#xff1a;本文围绕开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序&#xff0c;深入探讨其积分使用价值的丰富策略。详细分析积分兑换礼品、会员升级、积分抵现等方式在该特定商城小程序环境下的应用特点、存在问题及对用户和商城的影响&#xff0c;旨在为商城的优化运…

UE4安卓Gradle工程中的libUE4.so的生成原理

流程图 流程图放在最前面&#xff0c;下面是讲解。 libUE4.so 问&#xff1a;在UE4安卓开发中&#xff0c;libUE4.so即是符号表&#xff0c;又是引擎代码native&#xff0c;是吗&#xff1f; 答&#xff1a;是的&#xff0c;libUE4.so在UE4安卓开发中既包含符号表&#xff0c;…

Java线程池的核心内容详解

文章内容已经收录在《面试进阶之路》&#xff0c;从原理出发&#xff0c;直击面试难点&#xff0c;实现更高维度的降维打击&#xff01; 目录 文章目录 目录Java线程池的核心内容详解线程池的优势什么场景下要用到线程池呢&#xff1f;线程池中重要的参数【掌握】新加入一个任…

Pandas DataFrame学习

1.DataFrame定义 DataFrame 是 Pandas 中的另一个核心数据结构&#xff0c;用于表示二维表格型数据。DataFrame 是一个表格型的数据结构&#xff0c;它含有一组有序的列&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔型值&#xff09;。DataFrame 既有行索…

如何在创建完fb公共主页后添加管理员防止封号?

在创建Facebook公共主页后&#xff0c;及时添加备用管理员是非常重要的。这可以帮助防止由于个人账号被封或其他限制因素导致无法继续管理公共主页的情况。以下是关于如何添加管理员及接受邀请的详细步骤。 Facebook公共主页的角色介绍 在Facebook公共主页上&#xff0c;有五种…

无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划

着重介绍通过对三维 PCD 点云进行处理生成 2D 栅格地图 PGM&#xff0c;而后将该 PGM 地图充分运用到无人系统路径规划之中&#xff0c;使得无人机能够依据此规划合理避开飞行路线上可能出现的障碍物。&#xff08;解决如何使用PGM的问题&#xff09; Hybrid A*算法 参考博客…

YOLOv10改进策略【注意力机制篇】| WACV-2024 D-LKA 可变形的大核注意 针对大尺度、不规则的目标图像

一、本文介绍 本文记录的是利用D-LKA模块优化YOLOv10的目标检测网络模型。D-LKA 结合了大卷积核的广阔感受野和可变形卷积的灵活性&#xff0c;有效地处理复杂的图像信息。本文将其应用到v11中&#xff0c;并进行二次创新&#xff0c;使网络能够综合多种维度信息&#xff0c;更…

人工智能中的机器学习和模型评价

文章目录 1.监督学习1.1线性回归1.2KNN算法1.3支持向量机 2.无监督学习2.1K-means聚类2.2FCA主成分分析 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从数据中学习并做出决策&#xff0c;而无需进行明确的编程。它涉及到开发算法和技术&#xff0c;使计算机能够…

HomeAssistant自定义组件学习-【二】

#要说的话# 前面把中盛科技的控制器组件写完了。稍稍熟悉了一些HA&#xff0c;现在准备写窗帘控制组件&#xff0c;构想的东西会比较多&#xff0c;估计有些难度&#xff0c;过程会比较长&#xff0c;边写边记录吧&#xff01; #设备和场景环境# 使用的是Novo的电机&#xf…

Docker Swarm简介

注意事项 Swarm 模式是用于管理 Docker 守护进程集群的一项高级特性。如果你打算将 Swarm 用作生产运行时环境&#xff0c;那就使用 Swarm 模式。如果你不打算使用 Swarm 进行部署&#xff0c;可改用 Docker Compose。如果正在为 Kubernetes 部署进行开发&#xff0c;可以考虑使…

JVM 运行时数据区

JVM整体架构 可以分为三层&#xff1a; 1 JVM外部&#xff0c;从源文件到Class文件&#xff0c;再装载到JVM 2 JVM运行时数据区&#xff0c;相当于就是避风港、运行的大后方。给执行程序提供后勤。 3 执行引擎层。和运行时数据区交互&#xff0c;完成执行任务。 运行时数据…

新加坡托管服务器VS香港托管服务器:AI时代的选择策略

在人工智能迅速发展的今天&#xff0c;服务器作为数据存储与计算的核心基础设施&#xff0c;其性能、稳定性和地理位置对于用户体验和业务效率至关重要。对于中国用户而言&#xff0c;在选择服务器时&#xff0c;新加坡服务器和香港服务器无疑是两个极具吸引力的选项。两者同属…

DAYWEB69 攻防-Java 安全JWT 攻防Swagger 自动化算法签名密匙Druid 泄漏

知识点 1、Java安全-Druid监控-未授权访问&信息泄漏 2、Java安全-Swagger接口-文档导入&联动批量测试 2、Java安全-JWT令牌攻防-空算法&未签名&密匙提取 Java安全-Druid监控-未授权访问&信息泄漏 Druid是阿里巴巴数据库事业部出品&#xff0c;为监控而…

vscode使用技巧

vscode如果要用来写不同的语言&#xff0c;可以通过创建的工作区&#xff0c;然后创建不同的快捷方式以便打开它 注&#xff1a;C/C 退回到1.8.4&#xff0c;为了生成可以配置的文件 1.创建工作区 将工作区另存为 -> 选择你要写的文件夹的根目录 -> Save 2.归纳可执行…

Android 托管 Github Action 发布 Github Packages ,实现 Mvn 免费自动化托管

自从多年前 JCenter 关闭服务之后&#xff0c;GSY 项目版本就一直发布在 Jitpack 上&#xff0c;如今每个月也都有大概 10w 左右下载&#xff0c;但是近年来时不时就会出现历史版本丢失的问题&#xff0c;而且有时候还不是某个具体版本丢失&#xff0c;而是版本里的某几个依赖突…

记录一次企业外部通过ssh 连接数据库的事DBeaver

情况大概是这样&#xff0c;公司算法供应商开通了连接某个服务器A的权限&#xff0c;但是数据库x是在另一台服务器B上。 直接通过外部连接数据库是不行的&#xff0c;需要借用服务器A来进行访问x 使用软件&#xff1a;DBeaver, 数据库x类型&#xff1a;oracle 需要的信息&am…

Java爬虫的京东“寻宝记”:揭秘商品类目信息

开篇&#xff1a;Java特工的神秘任务 在这个数据驱动的时代&#xff0c;我们就像一群特工&#xff0c;穿梭在数字的海洋中&#xff0c;寻找着隐藏的宝藏——商品类目信息。今天&#xff0c;我们将带领你一起&#xff0c;用Java这把精密的瑞士军刀&#xff0c;深入京东的神秘领…

Linux——— 信号

文章目录 前言&#xff1a;引入信号生活中的例子信号概念见一见Linux中的信号 浅度理解信号信号处理&#xff08;浅谈&#xff09;:如何自定义捕捉 信号保存&#xff08;浅谈&#xff09; 信号产生系统调用产生异常产生&#xff1a;浅谈除0异常浅谈解引用野指针异常Core &&…

Java面试经典 150 题.P169. 多数元素(005)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int majorityElement(int[] nums) …