IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++面向对象特性之封装、抽象、继承、多态的简单理解 -> 正文阅读

[C++知识库]c++面向对象特性之封装、抽象、继承、多态的简单理解

c++面向对象特性之封装、抽象、继承、多态的简单理解

封装

封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制程序对类属性的读取和修改。函数是最简单的封装,是一种抽象化的概念,一般来说,封装成类是我们口头含义上的封装。

  1. 对于类的内部,成员函数可以自由修改成员变量,进行更精确的控制;
  2. 对于类的外部,良好的封装能够减少耦合,同时隐藏实现细节。

C++类成员的三种访问权限:public/protected/private

试想如果对类中成员变量的访问不做限制,那任何代码都可以访问、修改,虽然这样看起来更加灵活,但也意味着不可控,成员变量可以随意被修改,而且修改逻辑可能在代码中的各个角落,影响代码的可读性、可维护性。
要了解封装,离不开“私有化”,就是将类或者是函数中的某些属性限制在某个区域之内,外部无法调用。
所以封装数据的主要原因是:保护隐私(把不想别人知道的东西封装起来)
隔离复杂度(比如:电视机,我们看见的就是一个黑匣子,其实里面有很多电器元件,对于用户来说,我们不需要清楚里面都有些元件,电视机把那些电器元件封装在黑匣子里,提供给用户的只是几个按钮接口,通过按钮就能实现对电视机的操作。)
封装分为两个层面:第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空间,我们只能用类名.或者obj.的方式去访问里面的名字,这本身就是一种封装。第二个层面的封装:类中把某些属性和方法隐藏起来(或者说定义成私有的),只在类的内部使用、外部无法访问,或者留下少量接口(函数)供外部访问。

抽象

抽象包括两个方面,一是数据抽象,二是过程抽象。

  1. 数据抽象,关注于目标的特性信息,比如理解成我们抽象出来的那些入参数,这些参数是函数或类需要使用的,由封装后对外暴露的数据抽象、特性;
  2. 过程抽象,关注于目标的功能是什么,而不是功能是怎么实现的,即就是当成黑匣子,只关注最后实现了什么功能,至于过程隐藏在封装的细节代码中了。

封装主要讲的是隐藏信息、保护数据,而抽象讲的是隐藏方法的具体实现。

类的方法主要通过“函数”这一语法机制来实现的。通过函数包裹具体的实现逻辑,这本身就是一种抽象。调用者在使用函数的时候,并不需要去研究函数内部的实现逻辑,只需要通过函数的命名、注释或者文档,了解其提供了什么功能,就可以直接使用了。

多态

继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。其继承的过程,就是从一般到特殊的过程。
通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”,通过继承,子类获得父类的成员变量(属性)和方法等

C++类的三种继承方式:public/protected/private

从继承关系上来讲,继承可以分为两种模式,单继承和多继承。

单继承表示一个子类只继承一个父类;
多继承表示一个子类可以继承多个父类。
继承最大的一个好处就是代码复用。假如两个类有一些相同的属性和方法,我们就可以将这些相同的部分,抽取到父类中,让两个子类继承父类。这样,两个子类就可以重用父类中的代码,避免代码重复写多遍。不过,过度使用继承,继承层次过深,也会导致代码可读性、可维护性变差。

多态

多态,即同一个行为具有多个不同表现形式或形态的能力。表现形式有覆盖和重载。
多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定要调用的函数。多态,字面意思多种形态。
  C++的多态性是通过虚函数来实现的,虚函数允许派生类重新定义成员函数,而派生类重新定义基类的做法称为覆盖,或者称为重写。(重写的话可以有两种,直接重写成员函数和重写虚函数,只有重写了虚函数的才能算作是体现了C++多态性)而重载则是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,参数类型不同,或者两者都不同。编译器会根据这些函数的不同参数列表,将同名的函数的名称进行修饰,从而生成一些不同名称的预处理函数,来实现同名函数调用时的重载问题,但这并没有体现多态性。

多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的,比如有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),也称为函数重载,后面会解释。
而如果函数调用的地址不能在编译器期间确定,需要在运行时才可以确定,这就属于晚绑定。
  那么多态的作用是什么呢,封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。

最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,这就无法实现一个接口,多种方法的目的了。

不得不提一提函数重载了:
重载指在相同作用域中存在多个同名的函数,这些函数的参数表不同,编译器根据函数不同的形参表对同名函数的名称做修饰,然后这些同名函数就成了不同的函数。其实也就是早绑定上面提到的早绑定,
当然有的说重载不属于多态,也有的说是静态多态,还有的说重载只是多态里的一种,诸如此类,其实没必要纠结其中,只要能明白如何运用覆盖、重载不也就行了?

https://blog.csdn.net/ruyue_ruyue/article/details/8211809
https://zhuanlan.zhihu.com/p/164805654
https://blog.csdn.net/geerniya/article/details/79933086
https://blog.csdn.net/ypt523/article/details/79598289

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:32:07  更:2021-07-23 10:34:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 19:47:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码