C++—面向对象三大特性以及多态重点详解

一、面向对象的三大特征

引言:C++是面向对象的编程语言,C是面向过程的编程语言。接下来我们先简单讲一下面向对象的三大特征。

继承:使用现有类的所有功能,⽆需重新编写即可实现功能的拓展

封装:将客观事务封装成抽象的类,将代码与数据捆绑在一起,避免外界干扰和不确定性访问;自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

多态:对不同对象发送同⼀个消息,不同对象会做出不同的响应

        • 函数重载、函数模板时候体现出来的多态

        • 调⽤成员函数时候,根据指针指向对象的类型执行不同的函数(基类指针/引⽤指向派⽣类对象) 

1、继承

让某种类型对象获得另一个类型对象的属性和方法,方便资源重用。

它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展

常见的继承有三种方式

  1. 实现继承:指使用基类的属性和方法而无需额外编码的能力
  2. 接口继承:指仅使用属性和方法的名称、但是子类必须提供实现的能力
  3. 可视继承:指子窗体(类)使用基窗体(类)的外观和实现代码的能力(C++里好像不怎么用)

       例如,将人定义为一个抽象类,拥有姓名、性别、年龄等公共属性,吃饭、睡觉、走路等公共方法,在定义一个具体的人时,就可以继承这个抽象类,既保留了公共属性和方法,也可以在此基础上扩展跳舞、唱歌等特有方法

2、封装

        将一些属性和相关方法封装在一个对象中,对外隐藏内部具体实现细节。内部实现,外界不需要关心,外界只需要根据“内部提供的接口”去使用就可以。数据和代码捆绑在一起,避免外界干扰和不确定性访问。

        封装,也就是把客观事物封装成抽象的类,并且可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏,例如:将公共的数据或方法使用public修饰,而不希望被访问的数据或方法采用private修饰。

好处:使用方便、数据安全、利于代码维护

总结,用类实现封装,用封装实现高聚合,低耦合

2.1 封装的意义

a)保护或防止代码(数据)在无意中被破坏。保护类中的成员,不让类以外的程序直接访问或修改,只能通过提供的公共接口访问(数据封装)

b)隐藏方法(实现)细节,只要接口不变,内容的修改不会影响到外部的调用者(方法封装)

c)封装可以使对象拥有完整的属性和方法(类中的函数)

d)外部不能直接访问对象的属性,只能通过该属性对应的公有方法访问

2.2 对象封装原则

a)内聚:指一个模块(类)内部各个部分之间的关联程度

b) 耦合:指各个模块(类)之间的关联程度

总结:用类实现封装,用封装来实现高内聚,低耦合

3、多态

同一事物表现出不同事物的能力,即向不同对象发送同一消息,不同的对象在接收时会产生不同的行为**(重载实现编译时多态,虚函数实现运行时多态)**。

多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单一句话:允许将子类类型的指针赋值给父类类型的指针

二、多态的实现方式?

  1. 静态类型:对象在声明时采用的类型,在编译期既已确定;
  2. 动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的;
  3. 静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期;
  4. 动态绑定:绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期;

▪ 静态多态/静态绑定:编译期间确定;函数重载、函数模板

▪ 动态多态/动态绑定:运行期间确定;虚函数+继承实现,基类指针/引用运⾏期间再决定使⽤哪个函数

 三、动态多态/动态绑定作⽤?必要条件?如何实现?

作用:提⾼代码复用性;使基类指针/引用可以使⽤派生类功能,接⼝重⽤,向后兼容,提⾼可扩充性和可维护性

必要条件:继承、虚函数(virtual)、基类指针/引⽤

如何实现

        • 编译器发现含有虚函数的类,会创建⼀个虚函数表,对象中会有⼀个vptr指向虚函数表;

        • 基类指针指向派⽣类对象时候,vptr替换,就指向了派⽣类的虚函数表

虚函数利用虚函数表有两种方式,一种是按地址,C++就是,比如派生类的一个虚函数位于虚函数表的第二个位置vtable[1],那么多态就表现在基类的vptr指向vtable[1]时就能调用派生类的虚函数。还有一种方式是按照函数名。 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃代码的航航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值