
⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///
WARNING \]: DETECTING HIGH ENERGY
**🌊 🌉 🌊 心手合一 · 水到渠成**

|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
| **\>\>\> ACCESS TERMINAL \<\<\<** ||
| [**\[ 🦾 作者主页 \]**](https://blog.csdn.net/fengtinghuqu520?spm=1000.2115.3001.5343) | [**\[ 🔥 C语言核心 \]**](https://blog.csdn.net/fengtinghuqu520/category_12955956.html) |
| [**\[ 💾 编程百度 \]**](https://blog.csdn.net/fengtinghuqu520/category_13083835.html) | [**\[ 📡 代码仓库 \]**](https://blog.csdn.net/fengtinghuqu520/article/details/147275999?spm=1001.2014.3001.5502) |
---------------------------------------
Running Process: 100% \| Latency: 0ms
*** ** * ** ***
#### 索引与导读
* [1. 多态的基本概念](#1. 多态的基本概念)
* [2. 多态的分类](#2. 多态的分类)
*
*
* [A. 编译时多态(静态多态)](#A. 编译时多态(静态多态))
* [B. 运行时多态(动态多态)](#B. 运行时多态(动态多态))
* [3. 什么是虚函数?](#3. 什么是虚函数?)
* [4. 多态的构成条件](#4. 多态的构成条件)
* [5. 隐藏](#5. 隐藏)
*
* [5.1)隐藏的两种基本情况](#5.1)隐藏的两种基本情况)
*
* [A. 函数同名,但参数不同](#A. 函数同名,但参数不同)
* [B. 函数同名,参数也相同,且无 \`virtual\`](#B. 函数同名,参数也相同,且无 `virtual`)
* [5.2)隐藏 VS 重写](#5.2)隐藏 VS 重写)
* [5.3)代码示例](#5.3)代码示例)
* [6. 多态的原理](#6. 多态的原理)
*
* [6.1)虚函数表指针](#6.1)虚函数表指针)
* [6.2)虚函数表 (vtable)](#6.2)虚函数表 (vtable))
* [6.3)动态绑定与静态绑定](#6.3)动态绑定与静态绑定)
*
* [1. 静态绑定](#1. 静态绑定)
* [2. 动态绑定](#2. 动态绑定)
* [核心区别:静态类型 vs 动态类型](#核心区别:静态类型 vs 动态类型)
* [💻结尾--- 核心连接协议](#💻结尾— 核心连接协议)
## 1. 多态的基本概念
从字面上理解,**多态意为"多种状态"**,即同一个行为在不同的对象上具有不同的表现形式
*** ** * ** ***
**想象一下"按回车键"这个动作:**
* 如果你正在写文档,按回车是"换行"。
* 如果你正在浏览网页,按回车是"跳转/搜索"。
* 如果你正在玩游戏,按回车可能是"打开聊天框"。
同样的指令(按回车),在不同的场景(对象)下产生了不同的结果。
*** ** * ** ***
## 2. 多态的分类
#### A. 编译时多态(静态多态)
在编译阶段就确定了要调用哪个函数。主要通过 **函数重载** (**Overloading**)实现。
* **例子** :同一个函数名 `add`,你可以定义 `add(int, int)`,也可以定义 `add(double, double)`。编译器会根据你传入的参数类型,自动选择对应的版本
*** ** * ** ***
#### B. 运行时多态(动态多态)
这是通常大家讨论"多态"时所指的核心概念。程序在运行期间才根据对象的实际类型来决定调用哪个函数。
* **前提条件** :
1. 必须有继承关系。
2. 子类\*\*重写(Override)\*\*父类的虚函数。
3. 父类指针或引用指向子类对象
*** ** * ** ***
## 3. 什么是虚函数?
> [🔗Lucy的空间骇客裂缝:虚函数讲解](https://blog.csdn.net/fengtinghuqu520/article/details/150899286?spm=1011.2415.3001.10575&sharefrom=mp_manage_link)
*** ** * ** ***
## 4. 多态的构成条件
多态是一个继承关系下的类对象,去调用同一函数,产生了不同的行为。比如 `Student` 继承了 `Person`。`Person` 对象买票全价,`Student` 对象优惠买票
* 必须是基类的**指针** 或者**引用**调用虚函数
* 被调用的函数必须是虚函数,并且完成了**虚函数重写/覆盖** 。

*** ** * ** ***
## 5. 隐藏
简单来说,隐藏是指:**派生类(子类)中定义了与基类(父类)同名的函数或变量,从而导致基类的成员在子类作用域内被屏蔽**
*** ** * ** ***
### 5.1)隐藏的两种基本情况
#### A. 函数同名,但参数不同
无论基类函数是否有 `virtual` 关键字,只要子类定义了同名但参数不同的函数,基类的同名函数就会被隐藏。
* **现象**:你无法通过子类对象直接调用父类的那个版本,编译器会报错,因为它只在子类里找到了匹配的函数名,但参数对不上。
#### B. 函数同名,参数也相同,且无 `virtual`
如果父类函数没有 `virtual` 关键字(即不是虚函数),而子类定义了一个完全一样的函数。
* **现象**:这不是重写(Override),而是隐藏。如果你用子类指针调用,执行子类版本;如果你用父类指针调用,执行的是父类版本
*** ** * ** ***
### 5.2)隐藏 VS 重写
| 特性 | 隐藏(Hiding) | 重写(Override) |
|---------------|------------|-------------------|
| 范围 | 派生类与基类之间 | 派生类与基类之间 |
| 函数名 | 必须相同 | 必须相同 |
| 参数列表 | 可以不同 | 必须完全相同 |
| `virtual` 关键字 | 基类函数无要求 | 基类函数必须有 `virtual` |
| 多态性 | 不支持多态,静态绑定 | 支持多态,动态绑定 |
*** ** * ** ***
### 5.3)代码示例
```cpp
#include