用了C++一段时间,感觉对C++慢慢有了一点认识,在这和大家分享一下。

C++是一款面向对象的语言,拥有面向对象语言的三大核心特性:继承,封装,多态。每一个特性的良好理解与使用都会为我们的编程带来莫大的帮助。下面我就这三个特性讲一下我对C++的理解。

继承

学过面向对象语言的人基本都可以理解什么是继承,但我们为什么要使用继承?

很多人说继承可以使代码得到良好的复用,当然这个是继承的一个优点,但代码复用的方法除了继承还有很多,而且有些比继承更好。我认为使用继承最重要的原因是继承可以使整个程序设计更符合人们的逻辑,从而方便的设计出想要表达的意思。比如我们要设计一堆苹果,橘子,梨等水果类,使用面向对象的方法,我们首先会抽象出一个水果的基类,而后继承这个基类,派生出具体的水果类。如果要设计的水果很多,我们还可以在水果基类基础上,继续生成新的基类,比如热带水果类,温带水果类,寒带水果类等,而后再继承这些基类。这样的设计思想就相当于人类的分类思想,简单易懂,而且设计出来的程序层次分明,容易掌握。

既然继承这么好,那该如何使用继承?

继承虽好但不能滥用,否则设计出来的程序会杂乱不堪。根据上面的介绍,可以发现继承主要用来定义一个东西是什么,比如热带水果是水果,菠萝是热带水果等,即继承主要用来设计一个程序的类的框架,将所要设计的东西用继承来设立一个基本结构。如果想为一个类添加一个行为或格外的功能,最好是使用组合的方式。如果想了解组合的方式,可以看一下比较著名的策略模式。

封装

封装是什么?

在C++中,比较狭隘的解释就是将数据与操作数据的方法放在一个类中,而后给每个成员设置相应的权限。从大一点的角度来说,封装就是将完成一个功能所需要的所有东西放在一起,对外部只开放调用它的接口。

为什么要封装?

我认为模块化设计是封装的本质原因。

对软件设计或其他工程设计,特别是比较复杂的工程,一般都是模块化设计。模块化设计的好处就是可以将一个复杂的系统拆分成不同的模块。每一个模块又可以独立的设计,调试,这就让多人一起做一个复杂的工程成为现实。如果想做到模块化设计,封装是不可缺少的一部分。一个好的模块,比如一块inter的CPU芯片,它有强大的功能,虽然我们不知道它内部是如何实现的,但却可以很好的使用它。

多态

什么是多态?

多态简单的说就是“一个函数,多种实现”,或是“一个接口,多种方法”。多态性表现在程序运行时根据传入的对象调用不同的函数。

C++的多态是通过虚函数来实现的,在基类中定义一个函数为虚函数,该函数就可以在运行时,根据传入的对象调用不同的实现方法。而如果该函数不设为虚函数,则在调用的过程中调用的函数就是固定的。比如下面一个例子

  1. //

  2. //定义一个Duck基类,而后继承Duck派生出一个RedHandDuck类。

  3. //其中display()方法,第一次运行设为普通函数,第二次设为虚函数

  4. #include "iostream"

  5. class Duck {

  6. public:

  7. Duck(){}

  8. ~Duck(){}

  9. //定义一个虚函数display

  10. virtual void display(){

  11. std::cout<<" I am a Duck !"<<std::endl;

  12. }

  13. };

  14. class RedHandDuck:public Duck{

  15. public:

  16. RedHandDuck(){}

  17. ~RedHandDuck(){}

  18. //重写display

  19. void display(){

  20. std::cout<<" I am a RedHandDuck !"<<std::endl;

  21. }

  22. };

  23. int main(){

  24. RedHandDuck* duck1 = new RedHandDuck();

  25. Duck* duck2 = duck1;

  26. duck1->display();

  27. duck2->display();

  28. std::getchar();

  29. }

第一次运行结果(不使用虚函数):


第二次运行结果(使用虚函数):

由结果可以看到,由于虚函数的使用,Duck对象(可以理解为接口),调用的display()方法是根据传入的对象决定的。这就实现了“一个接口,多种方法”。

从网上看到一个关于多态的介绍,非常精辟,分享给大家

  多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。

对C++继承,封装,多态的理解相关推荐

  1. 面试:对封装、继承、多态的理解。

    1.封装     封装:就是隐藏对象的属性和实现细节,仅对外提供公共访问方式. 封装的好处:隐藏类的实现细节;让使用者只能通过程序员规定的方法来访问数据;可以方便的加入存取控制语句,限制不合理操作. ...

  2. 浅谈对于封装、继承与多态的理解(Java)

    目录 封装 继承 父类成员的访问 如何在子类中访问父类同名的成员 子类构造方法 代码块在继承上的执行顺序 多态 多态的实现条件 重写 多态的优缺点 面向对象程序的三大特征:封装继承和多态. 封装 · ...

  3. java 继承与多态的区别_【转】 【JavaSE】继承与多态的理解与区别

    抽象类的特点: A:抽象类和抽象方法必须用abstract关键字修饰 B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类 C:抽象类不能实例化 因为它不是具体的. 抽象类有构造方法,但是 ...

  4. 抽象、封装、继承、多态--基本理解

    抽象: 我们在定义一个类的时候,实际上就是把一类事物的公有的属性和行为提取出来,形成一个物理模型,这种研究问题的方法称为抽象. 封装: 封装就是把抽象的数据和对数据进行的操作封装在一起,数据被保存在内 ...

  5. 封装、继承、多态 通俗理解

    比较抽象,只是一种概念,刚开始学的时候无需太过于深究,如果要你一上来学JAVA就理解这些东西,有点牵强,你所要做的就是至少看到代码知道这个用到的是什么. 封装的概念好比一辆汽车,你学开车的时候只需学会 ...

  6. 封装、继承、多态的理解

    2019-05-28 15:02 封装:隐藏对象的属性和实现细节,对外提供公共的访问方式,以防止数据的随意访问和修改. 继承:通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类. 多态: ...

  7. 继承 封装 多态 (基础)描述性理解

    面向对象程序设计具有:封装性,继承性,多态性. 1封装 封装是面向对象编程的核心思想.将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想.例如我们使用的电脑,电视, ...

  8. 简述Java中封装,继承,多态的理解

    1.封装 意义:防止数据被无意破坏. 如何实现:把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法. 好处: 它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作. ...

  9. java中封装、继承、多态的理解

    封装就是把普通的对象进行封装,对象的属性设为私有的,对外提供get和set方法,其他类只能通过get和set对对象属性值进行操作. 继承是发生在两个类之间,一个类继承另一个类,是说这个类属于另一个类, ...

  10. 面向对象之三大特性:继承,封装,多态

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

最新文章

  1. 【QT】二进制读取图像文件测试
  2. 组合问题 contest4
  3. Hamburger Steak 贪心-锅子问题-先求最小耗时再贪心
  4. yum安装k8s集群(单master两个node、阿里云镜像源)
  5. ElasticSearch入门 —— 集群搭建
  6. 整理ASP.NET MVC 5各种错误请求[401,403,404,500]的拦截及自定义页面处理实例
  7. 增加无线模块传输距离的方法
  8. 群同态基本定理证明_有限群的线性表示 | 表示与群代数
  9. javascript实现的一个信息提示的小功能/
  10. 四种JAVA架构演进史,程序员能学会最后一种就非常厉害了,至少50k
  11. 测试人员在工作中如何查日志?
  12. jQuery - 不同版本的差异汇总(版本选择建议)
  13. bootstrap实现树节点、树结构
  14. JAVA 删除json中反斜杠_如何去除spring的ModelMap的返回类型的JSON序列化字符串中带有反斜杠符号...
  15. Cocos Creator发布微信小游戏包内体积过大问题
  16. 19 Python __dict__与dir()区别
  17. php 统计磁盘大小,PHP_PHP统计目录大小的自定义函数分享,计算文件、磁盘分区和目录的 - phpStudy...
  18. R语言lattice包介绍
  19. sip URI与sips URI的区别
  20. 计算机硬件基础知识txt,计算机硬件基础知识及使用方法简介

热门文章

  1. 《高性能MySQL》读书笔记-第6章-性能查询优化
  2. 垂死病中惊坐起_我如何开始恢复垂死的软件团队的过程
  3. java三目运算符简化代码_如何使用传播运算符简化代码
  4. code craft_Craft.io,设计和代码
  5. 使用Redux-Saga进行异步操作
  6. android项目实战博学谷源码_阿里爆款SpringBoot项目实战PDF+源码+视频分享
  7. 从零搭建Redis-Scrapy分布式爬虫
  8. json字符串,JSON对象,JSON数组的区别与相互转换
  9. Python操作MySQL(一)
  10. 二叉树的深度优先遍历原理及python实现