C++学习——面向对象三大特性:封装、继承、多态

本文详细介绍了C++中的面向对象三大特性:封装、继承和多态,包括它们的概念、作用、访问权限控制以及实现机制。同时涵盖了静态联编与动态联编的区别,以及多态在代码模块化和接口重用中的应用。
摘要由CSDN通过智能技术生成

今天来更新面向更新的三大特性,分别是封装、继承、多态,是C++面试中常考也是非常重要的面试题之一,如果最近有春招的宝可以关注我噢,我会定时分享C++相关常考的知识与面试题哒!

此外,我还会额外更新一个使用C++语言开发的集群聊天室项目,有兴趣的宝可以一起来实操一下,巩固一下C++的知识吧~

话不多说,今日知识摄入开始!

一、面向对象的三大特征

面向对象的三大基本概念:类、对象、继承

面向对象的三大特征是封装性、继承性和多态性

封装性将客观事物抽象成类,把复杂的细节封装在内部,仅提供简单的接口即可,封装可以隐藏实现细节,使得代码模块化保护或者防止数据被无意破坏。每个类自身的数据和方法实现权限控制,只让可信的类或者对象操作,对不可信的类进行信息隐藏

继承性:继承可以使得子类具有父类的各种属性和方法,无需重新编写。

多态性:多态是指不同对象接收相同消息时产生不同的动作,通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为。在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。

二、面向对象的认识

传统的程序设计多是基于功能的思想来进行考虑和设计的

面向对象是一种对现实世界理解和抽象的方法、思想,通过将需求要素转化为对象进行问题处理的一种思想。

面向对象的意义:以模块为中心构建可复用的软件系统;提高软件产品的可维护性和可扩展性。从用户的角度考虑对象描述对象所需的数据以及描述用户与数据交互所需的操作

三、类的访问与继承权限

(1)public:用该关键字修饰的成员表示公有成员,该成员不仅可以在类内可以被访问,在类外也是可以被访问的,是类对外提供的可访问接口;

(2)private:用该关键字修饰的成员表示私有成员,该成员仅在类内可以被访问,在类体外是隐藏状态;

(3)protected:用该关键字修饰的成员表示保护成员,保护成员在类体外同样是隐藏状态,但是对于该类的派生类来说,相当于公有成员,在派生类中可以被访问。

①若继承方式是public,基类成员在派生类中的访问权限保持不变

②若继承方式是private,基类所有成员在派生类中的访问权限都会变为私有(private)权限;

③若继承方式是protected,基类的公有成员和保护成员在派生类中的访问权限都会变为保护权限,私有成员在派生类中的访问权限仍然是私有权限。

四、继承

一个类继承了另一个类的属性和方法,称为子类或者派生类,被继承的类称为父类或者基类

4.1 关系

1、组合——has a

一个类里面的数据成员是另一个类的对象

创建组合类的对象:首先创建各个内嵌对象,创建对象时既要对基本类型的成员进行初始化,又要对内嵌对象进行初始化。

构造函数的执行顺序:先调用内嵌对象的构造函数,然后按照内嵌对象成员在组合类中的定义顺序,与组合类构造函数的初始化列表顺序无关。然后执行组合类构造函数的函数体,析构函数调用顺序相反。

组合的优点:

(1)当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象时不可见的。

(2)当前对象与包含的对象是一个低耦合关系,如果修改包含对象的类中代码不需要修改当前对象类的代码。

(3)当前对象可以在运行时动态的绑定所包含的对象

组合的缺点:容易产生过多的对象、为了能组合多个对象,必须仔细对接口进行定义。

2、继承——is a

继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。

继承的缺点有以下几点:

(1)父类的内部细节对子类是可见的。

(2)子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行为。

(3)如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法必须做出相应的修改。

4.2 继承的实现形式

1.实现继承(使用基类的属性和方法而无需额外编码的能力)

2.可视继承(子窗体使用父窗体的外观和实现代码)

3.接口继承(仅使用属性和方法,实现滞后到子类实现)

4.3 多重继承

C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承

多重继承的优点:对象可以调用多个基类中的接口;

如果派生类所继承的多个基类有相同的方法,而派生类对象需要调用这个祖先类的接口方法,就会存在浪费存储空间、二义性问题,加上作用域解析符确定调用哪一份拷贝

虚继承是解决C++多重继承问题的一种手段使用虚继承,使得多重继承类Programmer_Author只拥有Person类的一份拷贝。

4.4 构造函数和析构函数能否被继承?

不能。构造函数和析构函数是用来处理对象的创建和析构的,在整个层次中的所有的构造函数和析构函数都必须被调用。子类的构造函数会显示的调用父类的构造函数或隐式的调用父类的默认的构造函数进行父类部分的初始化。

4.5 类型转换

1、向上类型转换

将派生类指针或引用转换为基类的指针或引用,向上类型转换会自动进行,是安全的。

2、向下类型转换

将基类指针或引用转换为派生类指针或引用,向下类型转换不会自动进行,因为一个基类对应几个派生类,所以向下类型转换时不知道对应哪个派生类,在向下类型转换时必须加动态类型识别技术。RTTI技术,用dynamic_cast进行向下类型转换。

4种类型转换方式

(1)const_cast:用于将const变量转为非const,去除常量性的对象必须为指针或引用

(2)static_cast:

static_cast<type_id>(expression)

用处:

1.用于基本数据类型之间的转换不能用于基本类型指针间的转换

2.用于父类和子类之间指针或引用的转换上行转换是安全的;下行转换没有动态类型检查是不安全的;

3. 把void指针转换成目标类型的指针(不安全!),把任何类型的表达式转换成void类型。

(3)dynamic_cast:用于动态类型转换,只能用于含有虚函数的类,能安全地将指向基类的指针转型为指向子类的指针或引用动用运行时信息(RTTI)来进行类型安全检查

它通过判断在执行到该语句的时候变量的运行时类型要转换的类型是否相同来判断是否能够进行向下转换,失败会返回NULL(转型对象为指针时)或抛出异常bad_cast(转型对象为引用时)。

(4)reinterpret_cast:用于指针间的类型转换,几乎什么类型都可以转

4.6 继承的优缺点

优点:类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。

缺点:

(1)继承无法在运行时刻改变从父类继承的实现。

(2)父类通常至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

五、多态

面向对象超重要的特性来喽,与昨日更新的虚函数相关联,指路C++学习——虚函数-CSDN博客

5.1 实现原理

编译器发现一个类中有虚函数,便会立即为此类生成虚函数表 vtable。虚函数表的各表项为指向对应虚函数的指针。在类的构造函数中,编译器在此类中隐含插入一个指针vptr指向虚函数表,将类与vtable联系起来,指向基类的指针此时已经变成指向具体的类的 this 指针,这样依靠此 this 指针即可得到正确的 vtable。

5.2 静态联编和动态联编

在C++中,联编是指一个计算机程序的不同部分彼此关联的过程。按照联编所进行的阶段不同,可以分为静态联编和动态联编

静态联编是指联编工作在编译阶段完成的,在编译阶段就能确定程序的操作调用与执行该操作代码间的关系,又称为静态绑定。在C++中的编译时多态性是通过函数重载和运算符重载实现的。静态联编对函数的选择是基于指向对象的指针或者引用的类型

动态联编是指联编在程序运行时动态地进行基类指针是调用派生类的中的成员函数还是调用基类中的成员函数要到程序运行时确定。主要看此时基类指针所指向的对象称为动态绑定。只能通过指向基类的指针或基类对象的引用来调用虚函数

C++中一般情况下的联编是静态联编,但是当涉及到多态性和虚函数时应该使用动态联编。静态联编优点是效率高,但灵活性差。动态联编的优点是灵活性强,但效率低。

对象的静态类型,就是它在程序中被声明的时候采用的类型。

对象的动态类型:当前对象所指的类型,在运行期决定,对象的动态类型可变,静态类型无法更改。

实现动态联编三个条件:

(1)必须把动态联编的行为定义为类的虚函数

(2)类之间应满足子类型关系,通常表现为一个类从另一个类公有派生而来;

(3)必须先使用基类指针指向子类型的对象,然后直接或间接使用基类指针调用虚函数;

5.3 多态的作用

主要是两个:

(1)隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;

(2)接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

今日就更新到这里吧~如果有错误的地方还请及时批评指正,感谢大家~

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值