C++的特性(封装、继承、多态、抽象)的详解

2023-10-27

封装

封装目的:模块化+信息隐藏

封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据操作数据的方法进行有机结合。 是通过特性和行为的组合来创建新数据类型让接口具体实现相隔离。

C++中是通过类来实现的, 为了尽量避免某个模块的行为干扰同一系统中的其它模块,应该让模块仅仅公开必须让外界知道的接口。

继承

继承的目的:实现代码的重用、扩充

继承的步骤:

1、吸收基类成员(父类的全部成员除了构造函数和析构造函数)     

 2、改造基类成员(重写和重定义)                                                   

3、添加新的成员

继承的方式:public、 protected、 private(默认)                            

public(公有继承):父类中public类型的成员会被继承到子类的public中去,而父类的protected成员也会被继承到子类的protected中去

protected(保护继承):父类中无论是public的还是protected的成员都会被继承到子类的protected中去

private(私有继承):父类中 public 和 protected 的成员都会被继承到子类的private中去(实际相当于阻断了基类功能的继续派生)

派生类和基类的关系: 

1. 派生类对象存储了基类的数据成员

2. 派生类对象可以使用基类的方法

派生类和基类的特殊关系:

1.基类指针可以在不进行显式类型转换的情况下指向派生类对象

2.基类引用可以在不进行显式类型转换的情况下引用派生类对象

多继承

多继承(Multiple inheritance),即一个子类可以有多个父类,它继承了多个父类的特性。多继承可以看作是单继承的扩展。所谓多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。

继承下的构造函数:多继承形式下的构造函数和单继承形式基本相同,只是要在派生类的构造函数中调用多个基类的构造函数。基类构造函数的调用顺序和和它们在派生类构造函数中出现的顺序无关,而是和声明派生类时基类出现的顺序相同。

命名冲突:当两个或多个基类中有同名的成员时,如果直接访问该成员,就会产生命名冲突,编译器不知道使用哪个基类的成员。这个时候需要在成员名字前面加上类名和域解析符,以显式地指明到底使用哪个类的成员,消除二义性。

虚基类及其作用

引入虚基类的原因:如果一个派生类有多个直接基类,而这些直接基类又有一个共同基类,则最后的派生类中会保留其直接基类所继承的共同基类的多份同名成员,而引用这些同名的成员时,必须在派生类对象名后增加直接基类名以免产生二义性。占用大量的存储空间,易出错。

将共同基类设置为虚基类,这样从不同派生类继承来的同名数据成员在内存中就只有一个拷贝,同名函数也只有一种映射。维护一份成员副本

为了保证虚基类在派生时只被继承一次,应当在该基类的所有直接派生类中声明为虚基类,否则仍然会出现对基类的多次继承。

实现继承和接口继承

普通函数的继承是实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实现

虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写达成多态,继承的是接口。所以如果不实现多态,不要把函数定义成虚函数。

多态

多态的目的:接口重用

多态同样的消息不同类型的对象接收时导致不同的行为

多态分为:静态多态和动态的多态。

静态多态编译器编译期间完成的,编译器会根据实参类型来推断该调用哪个函数,如果有对应的函数,就调用,没有则在编译时报错。

动态多态:其实要实现动态多态,需要几个条件——即动态绑定条件:
1、虚函数。基类中必须有虚函数,在派生类中必须重写虚函数。
2、通过基类类型的指针或引用来调用虚函数。

什么是动态特性?

在绝大多数情况下, 程序的功能是在编译的时候就确定下来的, 我们称之为静态特性。 反之, 如果程序的功能是在运行时刻才能确定下来的, 则称之为动态特性。C++中, 虚函数,抽象基类, 动态绑定和多态构成了出色的动态特性。

多态的种类及不同种类介绍

1>强制多态:强制类型转换

强制多态是指将一种类型的值转换为另一种类型的值进行语义操作,从而防止类型错误。类型转换可以是隐式的,在编译时完成;也可以是显式的,可在动态运行时完成。

2>参数类型多态: 函数模板和类模板

参数多态与类模板相关联,它把功能相似仅数据类型(或类类型)不同的函数或类类设计为通用的函数模板或类模板,从而实现了相同的函数或类的成员函数对多种数据类型的数据处理。
泛型编程编写与类型无关的通用代码,是代码复用的一种手段,模板是泛型编程的基础.

3>重载多态(函数重载):函数名相同,但参数类型和参数个数顺序不同构成的多态

重载多态是多态性中最简单的形式,它分为函数重载和运算符重载。
1.函数重载
函数重载允许功能相近的函数使用相同的函数名,编译器根据参数列表的不同区别不同函数。
2.运算符重载
运算符重载是对已存在运算符赋予多重含义,同一个运算符作用于不同的类型数据导致不同类型的行为,它的实质是函数重载。

4>包含多态(运行时多态、虚函数重写实现、虚方法的动态联编):

包含多态的及实现包含多态的构成条件:
1.基类中必须包含有虚函数,在派生类中必须对基类中的虚函数进行重写。
2.必须通过基类的指针或者引用来调用虚函数。

 参考链接四种类型的多态详解

虚函数和动态绑定的关系?

虚函数是动态绑定的基础,虚函数是为了实现运行过程中的多态。

只有通过基类的指针或者引用调用虚函数时,才会发生动态绑定。

基类的指针可以指向派生类的对,基类的引用可作为派生类对象的别名。

抽象

抽象类的作用?

包含纯虚函数的类叫抽象类(也叫接口)抽象类不能实例化,但是可定义抽象类的指针和引用,发挥动态特性。

抽象类作为一个类族的公共接口,通过接口的完整实现(即派生类编写纯虚函数体)--->>接口调用实现动态特性。(一个函数指针可以被赋予不同函数的入口地址,实际被调用的函数一般到了运行时才能确定)

类与对象的区别?

类与对象的区别,如人类与张三的区别,它们是一般与个体、抽象与具体、集体与个体的区别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++的特性(封装、继承、多态、抽象)的详解 的相关文章

  • 运行应用程序时.NET 3.5 JIT 不工作

    以下代码在 Visual Studio 内部运行该版本和在 Visual Studio 外部运行该版本时提供不同的输出 我正在使用 Visual Studio 2008 并面向 NET 3 5 我也尝试过 NET 3 5 SP1 在 Vis
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 何时使用 C++ 私有继承而不是组合?

    你能给我一个具体的例子吗 什么时候使用私有继承优于组合 就我个人而言 我将使用组合而不是私有继承 但在某些情况下 使用私有继承可能是特定问题的最佳解决方案 正在阅读C faq http www parashift com c faq lit
  • 如何检查号码是否只有唯一的数字?

    例如 2345 是唯一的数字 因为没有数字显示两次 但 3324 不是唯一的数字 因为 3 出现了两次 我尝试使用 但我 代码 显示但我没有得到数字我得到了数字 编辑 你不能使用字符串 number 10 number 100 number
  • 如何部署包含第三方 DLL 文件的 C# 应用程序?

    首先 我对部署了解不多 我希望我的问题有意义 我需要将 C 应用程序安装 部署到多个桌面 它需要一个第三方 DLL 文件 一个 C 库 lpsolve55 dll 对于那些感兴趣的人 它是一个免费的 MIP LP 求解器 请参阅 lpsol
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 使用联合对 IP 地址进行多种解释?

    在工作中 我们使用以下构造来将 IP 地址解释为 4 字节数组或 32 位整数 union IPv4 std uint32 t ip std uint8 t data 4 这很好用 但是读完这本书的第 97 章 不要使用联合来重新解释表示
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • 包含从代码隐藏 (ASP.NET C#) 到 ASPX 中的图像概述的图像列表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收

随机推荐

  • LInux目录结构

    文章目录 Linux的目录结构 Linux的目录结构 Linux路径的描述方式 目录各功能介绍 HOME目录和工作目录 Linux的目录结构 Linux的目录结构 Linux的目录结构是一个树型结构 Windows 系统可以拥有多个盘符 如
  • C语言-函数指针和指针函数的用法和区别

    1 简介 本文主要介绍指针函数和函数指针的定义和区别 2 指针函数 2 1 定义 指针函数 其本质是一个函数 该函数的返回值是一个指针 声明格式为 类型标识符 函数名 参数表 简单函数声明 int f int x int y 该函数的返回值
  • 详解socket中TCP的三次握手和四次挥手机制

    无论参考OSI还是TCP IP的网络模型 我们从传输层向更底层看 各层的协议都是在直接或间接的服务于主机与主机之间的通信 而传输层则是在进程与进程通信层面上的 传输层有两个重要的协议 TCP Transmission ControlProt
  • git:分支切换

    1 分支简介 分支 是针对某类开发工作的一个提交结点序列 序列中最新的提交表示了该分支代码的最新版本 分支通常根据工作类别命名 例如 dev test 分支 使用分支意味着你可以分离各个开发路线 然后在彼此不影响情况下同时向前推进 当前分支
  • C/C++ VS. Fortran

    C C VS Fortran 项目 C C Fortran 备注 软硬件环境 操作系统 Windows XP professional 2002 Service Pack 3 CUP Intel Core 2 Quad 2 66GHz 4核
  • 夜神安卓7.1.2安装xposed踩坑(Could not load available ZIP files.Pull down to try again)

    详情见我的博客小生博客 报错如图 1 通用制作xposed目录解决办法 夜神模拟器见第二点 1 1下载xposed https dl xda xposed info framework 下载对应的sdk 模拟器要下载x86的 我是安卓7 1
  • 2022百度之星初赛总结(非题解)

    完了玩废了 0题罚坐 下来看题解 是有简单题 完全完全能做的 大一这都没罚坐 悲 ccpc预选赛开始了 希望队友健在 T1 从dij到bf到fl 判定条件是等于 与公开ac是惊人的像 但样例都没调出来 T2 题目k 1 k n理解为n 1到
  • 晶体管 放大电路的 分析

    三极管共集电极放大电路和共基极放大电路详解 https wenku baidu com view 036f033a31b765ce050814c4 html 共集电极放大电路 https wenku baidu com view 204a7
  • RDS MySQL空间优化最佳实践

    简介 在前三期介绍了RDS for MySQL参数优化 锁问题以及延迟优化最佳实践之后 本期将介绍存储空间相关的最佳实践 存储空间是RDS很重要的一个指标 在RDS的工单问题中 空间问题的咨询可以排在top 5 当RDS的实际使用空间超过了
  • android手机销售app(IDEA,SpringBoot,SSM,MySQL)+支付宝支付+全套视频教程

    本项目亮点 支付宝支付 eCharts柱状图图表数据统计 项目功能介绍 本系统包含后台管理和前端app双端系统 后台管理的功能包含 登录 退出 修改管理员信息 基本信息与头像 资源管理 角色管理 资源权限分配 字典管理 用户管理 图书管理
  • Matlab学习4-图像处理之图像加法、图像减法、加噪

    图像处理 图像加法 例图像的叠加 调亮色等 图像减法 例捕捉运动图像的轨迹 环境matlab2020 使用imadd 加 imsubtract 减 imresize 改 imnoise 图像加噪 matlab函数 imadd X Y 将两个
  • 农业温室大棚养殖系统智能监控方案

    温室大棚农作物的种植给人们的生活带来极大的便利 并得到了迅速的推广和应用 在不适宜植物生长的季节 为保证作物温室生育期和作物产量 实时地收集温度 湿度 光照 气体浓度以及土壤水分等信息并汇总物通博联智能网关上传到物通博联云 为了给农作物创造
  • WebSocket 协议使用

    WebSocket 协议实现在受控环境中运行不受信任代码的一个客户端到一个从该代码已经选择加入通信的远程主机之间的全双工通信 用于这个的安全模型是通 常由 web 浏览器使用的基于来源的安全模型 该协议包括一个打开阶段握手 接着是基本消息帧
  • 数据分析之数据预处理、分析建模、可视化

    大纲 思维导图 1 数据分析概述 1 1 简介 1 2 发展历程 1 3 应用领域 1 4 开发流程 2 数据类型 2 1 结构化与非结构化数据 2 2 定性与定量数据 2 3 截面数据与时间序列数据 3 数据来源 4 数据预处理方法 4
  • 初始vue(二)

    vue详细学习 二 class的操作 div class play judge data judge true div data msg div 1212323 div data msg div 1212323 div 不能解析 的内容 d
  • 【深度学习】Pytorch 系列教程(一):PyTorch数据结构:1、Tensor(张量):维度(Dimensions)、数据类型(Data Types)

    目录 一 前言 二 实验环境 三 PyTorch数据结构 0 分类 1 Tensor 张量 1 维度 Dimensions 0维 标量 1维 向量 2维 矩阵 3维张量 2 数据类型 Data Types 一 前言 ChatGPT PyTo
  • linux中gvim配置

    文章目录 前言 一 在哪配置 二 设置语句 三 运行结果 前言 对于在linux上工作的硬件工程师来说 换到一个新的服务器或者工作环境 首先要做的几件事中肯定有一项是设置gvim配置 这里纪录下我的常用gvim配置和注释 仅供参考 如有错误
  • mysql TRUNCATE delete

    mysql truncate 和delete 都用与删除数据表里的数据 truncate命令则是直接将全表的数据清空掉 delete命令可以不带where 可以达到同样的目的 delete通过where带上条件删除部分数据 从这可以看出de
  • Nginx_http_upstream_check_module应用

    ngx http upstream check module 该模块可以为Nginx提供主动式后端服务器健康检查的功能 该模块在Nginx 1 4 0版本以前没有默认开启 它可以在配置编译选项的时候开启 configure with htt
  • C++的特性(封装、继承、多态、抽象)的详解

    封装 封装目的 模块化 信息隐藏 封装 隐藏对象的属性和实现细节 仅对外公开接口和对象进行交互 将数据和操作数据的方法进行有机结合 是通过特性和行为的组合来创建新数据类型让接口与具体实现相隔离 C 中是通过类来实现的 为了尽量避免某个模块的