C++面向对象的特点
C++面向对象的特点
面向对象的特点主要有: 封装, 继承, 多态; 现在自己的简单理解如下, 但要明白具体怎么实现, 背后的原理是什么?
什么是封装, C++怎么实现封装
- 封装的大致可以分为: 函数的封装和类的封装, 函数的封装相当于把各个功能模块写成一个函数, 从上到下依次调用;
- 类的封装:就是把变量和函数接口封装为一个class, 这种类就相当于一种类型, 可以声明这种类型的变量, 叫作对象;
- 更官方的说法是: 封装将事物拥有的属性和动作隐藏起来, 只保留特定的方法和外界联系(即public函数接口);
- 封装就是抽象出类, 类含有属性和方法;
- 封装的好处就是代码功能分离;代码清晰易读;
什么是继承, C++怎么实现继承
- 继承就是子类可以拥有父类的属性和方法, public继承和private继承;
- 继承的优势是: 代码复用率高
什么是多态, C++怎么实现多态
- 多态: 简单理解就是一种接口, 可以具有多种不同的实现, 根据基类指针实际指向的类对象调用对应的方法;
- 多态实现的一个简单例子
- 加减乘除各用一个函数实现(既没有类的封装, 也没有体现继承, 更别说多态), 只能勉强说体现了函数封装(功能的封装);
- 封装就是将这四个功能函数封装成一个类, 包含两个操作变量和四个方法(其实有点为了封装而封装的成分);
- 为了体现继承和多态: 声明一个基类为纯虚类, 加减乘除声明为派生类, 但具体实现不一样;
- 多态也是分很多种的: 重载多态,强制多态,包含多态,参数多态;
- 普通函数和类的成员函数的重载属于重载多态,还有运算符重载;
- 强制多态包括类型强制转换等;
- 包含多态主要通过虚函数来实现;
- 参数多态和类模板相关;
- C++中的多态只能通过指向基类类型的指针和引用来调用对象的虚函数来实现; 因为可以用派生类对象来初始化或者给基类类型的指针赋值;
- 基类类型的指针所指向的对象有可能是基类型,也可能是派生类型,所以只有到运行时刻我们才知道指针所指向的对象到底是什么类型,所以当我们通过基类型的指针调用对象的虚函数时,只有判断该对象的类型后才知道调用的虚函数是哪一个类型的版本;
- 所谓多态,说到底,不外乎就是相同的函数名,不同的功能;
- 究C++编译器的实现,就会发现,所谓相同的函数其实在编译之后就变成不同的函数了,因为C++中的函数名被解析成类名+函数名+参数;
- 编译期多态以模板实现,运行期多态运用虚函数表实现;
- 了解虚函数表的位置, 虚函数表中各个虚函数指针的位置, 以及带有继承类的各个成员变量的位置;
- 指针和引用,这两个是运行时多态的基石;
- 创建一个基类指针,当它指向不同的对象时,调用的虚函数也不同,这就是多态;
- C++编译器实现多态的原理
- 当类中声明虚函数时,编译器会在类中生成一个虚函数;
- 虚函数表是一个存储类成员函数指针的数据结构;
- 虚函数表是由编译器自动生成与维护的;
- virtual成员函数会被编译器放入虚函数表中;
- 存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针);
多态, 虚函数, 纯虚函数的关系
- 官方一点的多态解释: 是对于不同对象接收相同消息时产生不同的动作;
- C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;
- 编译时多态通过模板函数, 模板类来实现, 编译时推导参数反演;
- 编译时多态性还可以体现在函数和运算符的重载上;
- 虚函数:在基类中冠以关键字 virtual 的成员函数, 它提供了一种接口界面, 允许在派生类中对基类的虚函数重新定义;
- 让每个类都可以覆盖这个方法的内容,非静态成员,具有继承性,不是重载声明而是覆盖,执行不同的函数,
通过指针指向或者引用, 在C++中,虚函数的唯一用处就是构成多态; - 如果不是虚函数继承, 基类指针或引用指向派生类, 调用同一方法其实是调用基类的方法, 编译器认为派生类应该退变为基类在被调用, 有一种隐式类型转换的味道在里面;
- 让每个类都可以覆盖这个方法的内容,非静态成员,具有继承性,不是重载声明而是覆盖,执行不同的函数,
- 纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义; 作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用; 具有纯虚函数的叫作抽象类(abstract);
C++面向对象的特点的更多相关文章
- angular2系列教程(六)两种pipe:函数式编程与面向对象编程
今天,我们要讲的是angualr2的pipe这个知识点. 例子
- 一起学 Java(二)面向对象
一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...
- js面向对象学习 - 对象概念及创建对象
原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- .NET 基础 一步步 一幕幕[面向对象之对象和类]
对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...
- 简单分析JavaScript中的面向对象
初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- JavaScript学习笔记(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- 带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...
- .NET基础拾遗(2)面向对象的实现和异常的处理基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
随机推荐
- Docker 概述
Docker 是一个开源的应用容器引擎 ,让开发者可以打包他们的应用及依赖环境到一个可移植的容器中,然后发布到任何运行有Docker引擎的机器上. 让大家可以随心所欲地使用软件而又不会深陷到环境配置中 ...
- 微信、支付宝支付SDK
1.首先是下载SDK,其对应的SDK在mvn上下载不了,需要手动配置到仓库 支付宝SDK下载地址 https://docs.open.alipay.com/54/103419 微信SDK官方下载地址 ...
- PHP7 学习笔记(十五)Repository 模式实现业务逻辑和数据访问的分离
参考: 1.http://laravelacademy.org/post/3063.html
- webService-cxf框架的使用
webService-cxf框架的使用: 1:简介: wbservice常用框架 Axis: --> Axis2 XFire: -->(Web Service框架) XFire是codeH ...
- j2ee应用开发调试工具
j2ee应用程序不能独立运行,需要运行在一个servlet/jsp容器中,常用的servlet/jsp容器如:tomcat,jetty等.在开发调试j2ee程序时,也需要部署在一个指定的容器中.如果每 ...
- Mac 下搭建环境 homebrew/git/node.js/npm/vsCode...
主要记录一下 homebrew/git/node.js/npm/mysql 的命令行安装 1. 首先安装 homebrew 也是一个包管理工具: mac 里打开终端命令行工具,粘下面一行回车安装br ...
- ElasticSearch - Shard数调优(ElasticSearch性能)
序言 资料 https://blog.csdn.net/waneyongfu/article/details/78215972
- 清除 SQL Server Management Studio 服务器名称历史记录
Ø 前言 在开发过程中,经常使用 SQL Server Management Studio 连接本地或远程 SQL Server 服务器,时间长了可能有些名称就不用了或者重复了,SQL Server ...
- PHP中遍历二维数组—以不同形式的输出操作
<body> <?php //定义二维索引数组$arr = array( array("101","李军","男", ...
- Linux静默安装matlab
对linux系统不是很熟,所有装起来有点费劲.来来回回折腾了二三天,查了很多攻略,但按照步骤老是报错,大体上各人设备不同.系统不同.环境设置不同,总是会多多少少略有差异. 一 基本配置 linux系统 ...