当前位置: 首页 > 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】 

http://www.lryc.cn/news/471196.html

相关文章:

  • 姿态传感器(学习笔记上)
  • labelimg使用教程
  • 力扣21 : 合并两个有序链表
  • 【Spring】Spring Boot 配置文件(7)
  • 《向量数据库指南》——解锁Wikipedia文章向量的跨语言搜索秘籍
  • 【力扣 + 牛客 | SQL题 | 每日5题】牛客SQL热题204,201,215
  • 下载数据集用于图像分类并自动分为训练集和测试集方法
  • Python xlrd库介绍
  • Javascript立即执行函数
  • Linux相关概念和易错知识点(17)(文件、文件的系统调用接口、C语言标准流)
  • 三防加固工业平板国产化的现状与展望
  • 3.1.3 看对于“肮脏”页面的处理
  • 学 Python 还是学 Java?——来自程序员的世纪困惑!
  • Spring Web MVC 入门
  • 吃牛羊肉的季节来了,快来看看怎么陈列与销售!
  • 租房业务全流程管理:Spring Boot系统应用
  • GCC之编译(7)Linker链接脚本
  • 【设计模式系列】适配器模式(九)
  • C# 文档打印详解与示例
  • Spring Cloud --- Sentinel 熔断规则
  • 使用爬虫爬取Python中文开发者社区基础教程的数据
  • 你了解kafka消息队列么?
  • 力扣102 二叉树的层序遍历 广度优先搜索
  • 堆(堆排序,TOP K, 优先级队列)
  • (三)行为模式:11、模板模式(Template Pattern)(C++示例)
  • 贝叶斯中的充分统计量
  • 012:ArcGIS Server 10.2安装与站点创建教程
  • xlive.dll错误的详细解决办法步骤教程,xlive.dll基本状况介绍
  • 通俗易懂的餐厅例子来讲解JVM
  • Python从入门到高手7.3节-列表的常用操作方法