【C++多态】 --- 多态实现原理简析

简介: 【C++多态】 --- 多态实现原理简析

1. 多态分类

多态分为两类

  • 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名
  • 动态多态: 派生类和虚函数实现运行时多态

静态多态和动态多态区别:

  • 静态多态的函数地址早绑定 - 编译阶段确定函数地址
  • 动态多态的函数地址晚绑定 - 运行阶段确定函数地址

2. 动态多态的满足条件

1. 有继承关系

2. 子类重写父类中的虚函数

动态多态使用条件

父类指针或引用指向子类对象

3. 多态实现的前提

赋值兼容规则是指在需要父类对象的地方可以使用子类对象来代替:

通过public继承,子类得到了父类除构造/析构函数之外的所有成员,且所有成员的访问属性和父类的完全相同。这样,public继承的子类实际就具备了父类的所有功能,凡是父类能解决的问题,子类都可以解决。

赋值兼容规则是发生在父类和子类之间的:

(1) 子类的对象可以赋值给父类对象对象,过程会发生隐式类型转换

(2) 父类类型的指针可以指向子类对象

(3) 父类类型的引用可以用子类对象初始化

发生赋值兼容后,子类对象只能被作为父类对象使用,即只能使用从父类继承而来的成员。

4. 多态实现原理简析

【C++】 --- 多态问题抛出与virtual关键字中的code为例讲解:

没有加virtual关键字时,sizeof(Animal)输出值为1,加了virtual关键字之后sizeof(Animal)输出值为4。Cat继承Animal类之后,其大小也是4.

是因为这时候类内部有一个指针vfptr [v - virtual, f - function, ptr - pointer],通过下面一个图进一步理解:

1> 当子类重写父类的虚函数,子类中的虚函数表 内部 会替换成 子类的虚函数地址

2> 当父类的指针或引用指向子类对象时,发生多态

目录
相关文章
|
25天前
|
C++
C++中的封装、继承与多态:深入理解与应用
C++中的封装、继承与多态:深入理解与应用
27 1
|
5天前
|
C++
C++一分钟之-继承与多态概念
【6月更文挑战第21天】**C++的继承与多态概述:** - 继承允许类从基类复用代码,增强代码结构和重用性。 - 多态通过虚函数实现,使不同类对象能以同一类型处理。 - 关键点包括访问权限、构造/析构、菱形问题、虚函数与动态绑定。 - 示例代码展示如何创建派生类和调用虚函数。 - 注意构造函数初始化、空指针检查和避免切片问题。 - 应用这些概念能提升程序设计和维护效率。
16 2
|
28天前
|
存储 编译器 C语言
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(下)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
33 1
|
8天前
|
C++
C++ 是一种面向对象的编程语言,它支持对象、类、继承、多态等面向对象的特性
C++ 是一种面向对象的编程语言,它支持对象、类、继承、多态等面向对象的特性
|
19天前
|
算法 编译器 C++
C++多态与虚拟:函数重载(Function Overloading)
重载(Overloading)是C++中的一个特性,允许不同函数实体共享同一名称但通过参数差异来区分。例如,在类`CPoint`中,有两个成员函数`x()`,一个返回`float`,另一个是设置`float`值。通过函数重载,我们可以为不同数据类型(如`int`、`float`、`double`)定义同名函数`Add`,编译器会根据传入参数自动选择正确实现。不过,仅返回类型不同而参数相同的函数不能重载,这在编译时会导致错误。重载适用于成员和全局函数,而模板是另一种处理类型多样性的方式,将在后续讨论中介绍。
|
6天前
|
C++
C++一分钟之-类与对象初步
【6月更文挑战第20天】C++的类是对象的蓝图,封装数据和操作。对象是类的实例。关注访问权限、构造析构函数的使用,以及内存管理(深拷贝VS浅拷贝)。示例展示了如何创建和使用`Point`类对象。通过实践和理解原理,掌握面向对象编程基础。
32 2
C++一分钟之-类与对象初步
|
1天前
|
编译器 C++
C++练级之路——类和对象(中二)
C++练级之路——类和对象(中二)
11 5
|
1天前
|
存储 编译器 C++
C++练级之路——类和对象(上)
C++练级之路——类和对象(上)
10 3
|
1天前
|
存储 Java C#
C++语言模板类对原生指针的封装与模拟
C++|智能指针的智能性和指针性:模板类对原生指针的封装与模拟
|
1天前
|
编译器 C++
C++练级之路——类和对象(中)
C++练级之路——类和对象(中)
7 1