本文最后更新于326 天前,其中的信息可能已经过时,如有错误请联系作者
C++的多态是如何实现的?
多态的原理
多态呢,其实就是指同一个函数名,通过不同的调用方式,具有不同的表现。C++的多态呢,分为编译时多态和运行时多态。编译时多态称为静态绑定,也就是在编译时就确定调用的函数。运行时多态称为动态绑定,通过继承和虚函数来实现。那是怎么实现的呢?
当我们声明了一个虚函数,编译器就会为该类生成一个唯一的虚函数表,在每个类对象的头部存放指向该表的指针,虚函数表里有什么呢?有一个RTTI结构体指针(说一下RTTI),其他就是虚函数地址。当子类继承该类时,会重新为子类生成一个新的虚函数表,并复制基类的虚函数表的内容,当我们再重写基类的虚函数时,新的虚函数将覆盖子类虚函数表中对应的基类虚函数。这种虚函数表在多继承,虚继承中会有不同的表现。
最后呢,当我们用基类指针指向派生类对象并调用虚函数时,会通过该对象的虚指针,查表调用对应的函数。
什么是oop思想?你怎么看面向对象思想?面向过程和面向对象的区别?
说到面向对象,就离不开面向过程,我先拿生活中的例子举例,比如汽车有加速,减速,转方向等功能
如果按面向过程来设计,则是分别设计三个函数,需要的时候来调用。
按面向对象来设计,则是先设计一个抽象的汽车类,然后将加速减速等行为,封装在这个类中,想要使用时,先实例化一个对象,再用这个对象调用这三个函数。
从刚才说的可以看出,面向过程就是将问题分解成一个又一个步骤,在需要的时候调用,重点放在了解决问题的步骤上。
而面向对象是将问题设计成相应的对象,是以对象为中心,重点放在了对象上,这个对象将整个系列的问题包含成自己的属性和行为,比如汽车的加速功能只是对象的行为。
Oop语言还有四大特征:封装 继承 多态 抽象
- 封装:封装是隐藏对象的内部状态和实现细节,仅通过公共接口暴露功能的过程。这意味着对象的内部表示(数据和实现)是不可见的,只能通过定义良好的接口与对象交互。例如,汽车的引擎是一个封装的单元,用户只能通过加速踏板、刹车踏板和方向盘来与它交互,而不必了解引擎内部的工作原理。
- 继承:继承是一种机制,允许创建一个新的类(称为子类)基于一个已存在的类(称为父类)。子类继承父类的属性和行为,并且可以添加新的属性和行为或者覆盖(修改)继承的行为。例如,运动车可以继承普通汽车的行为,并添加涡轮增压等新特性。
- 多态:多态允许对象采用多种形式。在OOP中,这意味着一个接口可以被多个类实现,每个类都可以以自己的方式实现该接口。这使得我们可以编写不依赖于具体类的代码,而是依赖于接口,从而提高代码的灵活性和可扩展性。例如,不同的汽车品牌可以有自己独特的加速方式,但它们都可以响应“加速”命令。
- 抽象:抽象是将复杂系统的某些方面提取出来,只展示最相关的特征的过程。在OOP中,抽象通常通过抽象类或接口实现,这些抽象类或接口定义了一组方法,而不需要实现它们。这使得程序员可以关注于什么需要被 done,而不是如何 done。例如,一个抽象的“车辆”类可以定义一个“驱动”方法,而不关心具体是汽车、摩托车还是卡车。
别卷了别卷了
哎,旭哥 重来没有这么迷茫,感觉沉浸在知识的海洋中,快要窒息了,我需要学习更多🙏
阿米诺思😡