C++ - 多态和虚函数相关
PS
因为近期面试常问,所以记录一下相关问题。
C++多态
-
什么是多态/如何理解多态:多态是面向对象编程的特性之一,还包含继承和封装,多态跟继承关系比较大。多态顾名思义多种形态,简单来说就是一个接口多种方法。具体来说就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。通常是为了在运行的时候,通过指向基类的指针,实现父类指针指向子类对象,来调用实现派生类中的方法(调用同一个方法实现不同效果)。
-
举个例子说明一下多态:高铁买票,对于不同群体票价不一样,成人、学生、老人等
-
C++多态分为两种多态,静态多态和动态多态。
-
静态多态:函数重载和运算符重载属于静态多态,复用函数名。
-
动态多态:派生类和虚函数实现运行时多态。
-
-
虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖/重写。
C++静态多态和动态多态区别
-
静态多态的函数地址早绑定,编译阶段确定函数地址。
-
动态多态的函数地址晚绑定,运行阶段确定函数地址。
C++虚函数
加 virtual 关键字。用法见:https://www.cnblogs.com/OFSHK/p/14536996.html
C++虚函数表
多态的实现原理就是虚函数表。
C++虚函数和多态关系(虚函数的多态性)
动态多态满足条件
-
有继承关系
-
子类重写父类的虚函数
-
重写:函数名、参数列表、返回值类型,所有都必须同基类中被重写的函数一致,只有函数体不同,派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。
-
重载:同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。
-
多态的目的
-
封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。
-
而多态的目的则是为了“接口重用”,也就是说不论传递过来的究竟是类的哪个对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」