C++中的封装,继承和多态

目录

摘要

封装(Encapsulation)

基础用法

继承(Inheritance)

基础用法

多态(Polymorphism)

1. 虚函数

2. 纯虚函数

总结


摘要

在C++中,封装、继承和多态是面向对象编程的三大核心特性。为了方便大家理解,下面我将举一些例子来简单说明一下。

封装(Encapsulation)

封装是将数据和操作数据的方法捆绑在一起,并隐藏对象的内部实现细节,只暴露必要的接口给外部使用。C++通过类和访问修饰符(publicprotectedprivate)来实现封装。

基础用法

#include <iostream>
#include <string>class Food {
private:std::string name;  // 食品名称double calories;   // 卡路里含量public:// 构造函数Food(const std::string& foodName, double foodCalories): name(foodName), calories(foodCalories) {}// 设置食品名称的方法void setName(const std::string& foodName) {name = foodName;}// 获取食品名称的方法std::string getName() const {return name;}// 设置卡路里含量的方法void setCalories(double foodCalories) {calories = foodCalories;}// 获取卡路里含量的方法double getCalories() const {return calories;}
};int main() {Food apple("Apple", 52);  // 创建食品对象std::cout << "Food: " << apple.getName() << ", Calories: " << apple.getCalories() << std::endl;apple.setName("Green Apple");apple.setCalories(48);std::cout << "Food: " << apple.getName() << ", Calories: " << apple.getCalories() << std::endl;return 0;
}

继承(Inheritance)

继承允许一个类(子类)从另一个类(父类)继承数据成员和成员函数,从而实现代码复用。C++支持单继承和多继承。

基础用法

#include <iostream>
#include <string>// 基类 Food
class Food {
protected:std::string name;double calories;public:// 构造函数Food(const std::string& foodName, double foodCalories): name(foodName), calories(foodCalories) {}// 获取食品名称的方法std::string getName() const {return name;}// 获取卡路里含量的方法double getCalories() const {return calories;}
};// 派生类 Fruit 继承自 Food
class Fruit : public Food {
public:// 构造函数Fruit(const std::string& fruitName, double fruitCalories): Food(fruitName, fruitCalories) {}// 显示水果信息的方法void displayInfo() const {std::cout << "Fruit: " << name << ", Calories: " << calories << " kcal" << std::endl;}
};// 派生类 Vegetable 继承自 Food
class Vegetable : public Food {
public:// 构造函数Vegetable(const std::string& vegetableName, double vegetableCalories): Food(vegetableName, vegetableCalories) {}// 显示蔬菜信息的方法void displayInfo() const {std::cout << "Vegetable: " << name << ", Calories: " << calories << " kcal" << std::endl;}
};int main() {Fruit apple("Apple", 52);  // 创建水果对象Vegetable carrot("Carrot", 41);  // 创建蔬菜对象apple.displayInfo();  // 显示水果信息carrot.displayInfo();  // 显示蔬菜信息return 0;
}

多态(Polymorphism)

多态允许使用基类的指针或引用来调用子类的重写方法,实际调用的方法在运行时决定。C++中的多态性通过虚函数实现。

1. 虚函数

#include <iostream>
#include <string>// 基类 Food
class Food {
public:// 虚函数 displayInfovirtual void displayInfo() const {std::cout << "This is a food item." << std::endl;}
};// 派生类 Fruit 继承自 Food
class Fruit : public Food {
private:std::string name;double calories;public:// 构造函数Fruit(const std::string& fruitName, double fruitCalories): name(fruitName), calories(fruitCalories) {}// 重写 displayInfo 方法void displayInfo() const override {std::cout << "Fruit: " << name << ", Calories: " << calories << " kcal" << std::endl;}
};// 派生类 Vegetable 继承自 Food
class Vegetable : public Food {
private:std::string name;double calories;public:// 构造函数Vegetable(const std::string& vegetableName, double vegetableCalories): name(vegetableName), calories(vegetableCalories) {}// 重写 displayInfo 方法void displayInfo() const override {std::cout << "Vegetable: " << name << ", Calories: " << calories << " kcal" << std::endl;}
};int main() {Food* food;Fruit apple("Apple", 52);Vegetable carrot("Carrot", 41);food = &apple;food->displayInfo();  // 将调用 Fruit 的 displayInfo 方法food = &carrot;food->displayInfo();  // 将调用 Vegetable 的 displayInfo 方法return 0;
}

2. 纯虚函数

#include <iostream>
#include <string>// 抽象基类 Drink
class Drink {
public:// 纯虚函数 displayInfovirtual void displayInfo() const = 0;  // 定义接口,但没有实现
};// 派生类 Juice 继承自 Drink
class Juice : public Drink {
private:std::string name;double volume;public:// 构造函数Juice(const std::string& juiceName, double juiceVolume): name(juiceName), volume(juiceVolume) {}// 实现纯虚函数 displayInfovoid displayInfo() const override {std::cout << "Juice: " << name << ", Volume: " << volume << " ml" << std::endl;}
};// 派生类 Soda 继承自 Drink
class Soda : public Drink {
private:std::string name;double volume;public:// 构造函数Soda(const std::string& sodaName, double sodaVolume): name(sodaName), volume(sodaVolume) {}// 实现纯虚函数 displayInfovoid displayInfo() const override {std::cout << "Soda: " << name << ", Volume: " << volume << " ml" << std::endl;}
};int main() {Juice orangeJuice("Orange Juice", 250);Soda cola("Cola", 330);// 创建 Drink 类型的指针数组Drink* drinks[2];drinks[0] = &orangeJuice;drinks[1] = &cola;// 遍历数组并调用 displayInfo 方法for (int i = 0; i < 2; ++i) {drinks[i]->displayInfo();  // 将调用具体对象的 displayInfo 方法}return 0;
}

总结

1. 封装:通过类和访问控制符(publicprotectedprivate)实现数据隐藏和接口统一。
2. 继承:允许一个类继承另一个类的属性和方法,促进代码复用。
3. 多态:允许基类指针或引用调用子类的重写方法,实际调用的方法在运行时确定。

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

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

相关文章

机器学习--损失函数

损失函数&#xff08;Loss Function&#xff09;&#xff0c;也称为代价函数&#xff08;Cost Function&#xff09;或误差函数&#xff08;Error Function&#xff09;&#xff0c;是机器学习和统计学中的一个重要概念。它用于量化模型预测值与真实值之间的差异。损失函数的值…

怎么换自己手机的ip地址

在互联网时代&#xff0c;IP地址已经成为了我们数字身份的一部分。无论是浏览网页、下载文件还是进行在线交流&#xff0c;我们的IP地址都在默默发挥着作用。然而&#xff0c;有时出于安全或隐私保护的考虑&#xff0c;我们可能需要更换手机的IP地址。那么&#xff0c;如何轻松…

C语言——函数指针

一、函数指针的定义 函数指针是指向函数的指针变量&#xff0c;可以用来动态调用不同的函数。使用函数指针的一般步骤如下&#xff1a; 1、定义函数指针类型&#xff1a;typedef 返回值类型 (*指针变量名)(参数列表); 2、声明函数指针变量并赋值&#xff1a;指针变量名 函数…

深入理解Android多线程开发:场景应用与解决方案解析

前言 在专栏之前的文章中,我们了解了并发、线程、线程安全、线程池等多线程开发的概念。本篇文章,我们来梳理一下在Android开发中我们面临的多线程开发中常见的应用场景和解决方案。 应用场景 资源复用和优化 并发控制与线程池的使用 为了优化资源利用和提高应用性能,需要…

【Spring Boot实现网页会话(Session )】

文章目录 前言什么是网页会话&#xff08;Session&#xff09;Spring Boot 中的 Session 管理Session 的创建与管理Session 的数据存储使用示例 前言 会话管理允许服务器在多次HTTP请求之间保持用户的状态信息&#xff0c;以便用户可以进行认证、保持登录状态等操作。 什么是…

电商系统中热库和冷库的使用与数据转换

在现代电子商务系统中&#xff0c;数据的高效管理和存储是关键。电商平台每日处理海量数据&#xff0c;这些数据不仅包括用户行为、交易记录&#xff0c;还涵盖库存信息、商品详情、物流信息等。为了优化数据存储和查询效率&#xff0c;电商系统通常采用热库&#xff08;Hot St…

C#操作MySQL从入门到精通(14)——汇总数据

前言 我们有时候需要对数据库查询的值进行一些处理,比如求平均值等操作,本文就是详细讲解这些用法,本文测试使用的数据库数据如下: 1、求平均值 求所有student_age 列的平均值 string sql = string.Empty; if (radioButton_AVG.Checked) {sql = “select AVG( student_…

Day47 代码随想录打卡|二叉树篇---最大二叉树

题目&#xff08;leecode T654&#xff09;&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 …

htb-linux-9-sense

nmap web渗透 目录爆破 靶机非常慢 system-users.txt ####Support ticket###Please create the following userusername: Rohit password: company defaults尝试登陆 现在我们知道了一个登陆的用户名&#xff0c;密码据称是公司默认密码。谷歌这个公司名称是pfsense现在用r…

web前端标书:深入剖析与精准构建

web前端标书&#xff1a;深入剖析与精准构建 在数字化浪潮席卷全球的今天&#xff0c;web前端技术作为连接用户与数字世界的桥梁&#xff0c;其重要性日益凸显。一份高质量的web前端标书&#xff0c;不仅是项目成功的关键&#xff0c;更是展现团队实力和专业素养的重要载体。本…

vue3如何定义一个组件

在 Vue 3 中&#xff0c;定义一个可以接收参数的组件通常是通过在组件的 props 选项中定义这些参数来完成的。当你使用组件时&#xff0c;你可以通过传递属性值来设置这些参数。 以下是定义可以接收参数的组件的步骤&#xff1a; 使用 <script> 而不是 <script setup&…

Web前端补习班:深度探索与提升之路

Web前端补习班&#xff1a;深度探索与提升之路 在信息时代的浪潮中&#xff0c;Web前端技术日新月异&#xff0c;对开发者提出了更高的要求。对于渴望在前端领域有所建树的你&#xff0c;或许正需要一场深入的补习班&#xff0c;来弥补知识的不足&#xff0c;提升技术的实力。…

C语言如何判断⽂件的结束?

一、问题 在⽂件中查找匹配的信息时&#xff0c;需要遍历⽂件中的数据信息。在遍历的过程中&#xff0c;如何判断⽂件的指针已经到了⽂件的结尾呢&#xff1f; 二、解答 1. 问题解析 在对⽂件的操作函数中&#xff0c;除了存在读写⽂件的函数&#xff0c;还有⽤于测试⽂件流是…

【Tool】Matlab 数据分析可视化

一、问题描述 近期围绕imu总是出现问题&#xff0c;自己整理了一下将数据可视化的工具 二、imu 类 1. 待处理数据格式 # yaw roll pitch time -2.08131 -0.0741765 0.0200713 121.281000000 -2.08724 -0.0745256 0.0197222 121.301000000 -2.093 -0.075747…

对Java中二维数组的深层认识

首先&#xff0c;在JAVA中&#xff0c;二维数组是一种数组的数组。它可以看作是一个矩阵&#xff0c;通常是由于表示二维数据节后&#xff0c;如表格和网格。 1.声明和初始化二维数组 声明 int[][] arr;初始化 int[][] arrnew int[3][4];或者用花括号嵌套 int[][] arr{{1,…

Python一些小操作

矢量图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats(svg)matplotlib中文问题 import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"]["SimHei"] #设置字体 plt.rcParams["axes.unicode_minus…

【张悦】短视频、直播自然流三频共振起号实操课(价值2980元)

介绍 01.账号雷区&#xff08;账号限流&#xff09;剪辑版 02.解除限流&#xff08;废号挽救&#xff09; 03.基础推流机制和热门指标 04.账号粉丝数据分析 05.标签规则“铁粉机制 06.看账号标签打标签了 07.视频看标签打标签 08.拔升流量池之“破播三板斧” 09.破播利器“神评…

【LeetCode:312. 戳气球+ 动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

ChromaDB初探

探索ChromaDB 在当今数据驱动的世界中&#xff0c;随着人工智能和机器学习的广泛应用&#xff0c;如何高效地存储、检索和操作大量向量数据成为了一个关键问题。ChromaDB作为一种强大的向量数据库&#xff0c;正在为解决这一问题提供全新的解决方案。在这篇博客中&#xff0c;…