[学习][记录] c++语言:从放弃到入门 <二>多态

简介: [学习][记录] c++语言:从放弃到入门 <二>多态

多态

多态可分为静态多态动态多态

一、静态多态

静态多态的实现在于静态联编,关联出现在编译阶段而非运行期,用对象名或者类名来限定要调用的函数,称为静态关联或静态联编。

常见有三种方法:

  1. 函数多态(函数与运算符的重载);
  2. 宏多态
  3. 模板多态。

我个人理解就是通过宏、模板生成代码、函数或运算符重载达到多态效果。

1.1 函数多态

1.2 宏多态

1.3 模板多态

二、动态多态

对于动态多态的实现是运行阶段把虚函数和类对象绑定在一起的,即动态联编,动态绑定。具体的说,通过一个指向基类的指针调用虚成员函数的时候,运行时系统将能够根据指针所指向的实际对象调用恰当的成员函数实现。

  • 动态绑定(动态多态),也称为“运行时绑定”,是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  • 没有virtual修饰,不会发生动态绑定,因此只是运行的父类版本

2.1 父类引用指向子类对象(上转型多态)

多态需要注意的问题

C++ 作为一种面向对象语言,其最重要的一个特征(也是面向对象的最重要的特征之一)是多态和动态绑定。所谓动态绑定,也称为“运行时绑定”,是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

没有virtual修饰,不会发生动态绑定,因此只是运行的父类版本

CRTP 也被称为“静态多态”。有些时候,我们编写多态的代码,但是子类并不是运行时才能确定,而是编译时已经确定了(或者我们仅仅是为了重用部分代码才使用了多态机制)。在这种情况下,我们完全可以将“多态”的实现提前到编译期。

相关文章
|
1天前
|
存储 编译器 程序员
【C++高阶】C++继承学习手册:全面解析继承的各个方面
【C++高阶】C++继承学习手册:全面解析继承的各个方面
|
1天前
|
JavaScript 前端开发 编译器
【C++初阶】C++模板编程入门:探索泛型编程的奥秘
【C++初阶】C++模板编程入门:探索泛型编程的奥秘
|
1天前
|
存储 编译器 C语言
【C++入门】—— C++入门 (下)_内联函数
【C++入门】—— C++入门 (下)_内联函数
|
1天前
|
存储 安全 编译器
【C++入门】—— C++入门 (中)_引用
【C++入门】—— C++入门 (中)_引用
|
1天前
|
人工智能 安全 编译器
【C++入门】—— C++入门 (上)_命名空间
【C++入门】—— C++入门 (上)_命名空间
|
2天前
|
程序员 C语言 C++
【C++语言】继承:类特性的扩展,重要的类复用!
【C++语言】继承:类特性的扩展,重要的类复用!
|
2天前
|
C++ 容器
【C++语言】String 类关键函数实现,手搓一个简单字符串类!
【C++语言】String 类关键函数实现,手搓一个简单字符串类!
|
2天前
|
C++ 容器 存储
【C++语言】想学STL,先细细拿捏string类,万字详解string类 (内附精美思维导图)
【C++语言】想学STL,先细细拿捏string类,万字详解string类 (内附精美思维导图)
|
2天前
|
编译器 C++ 容器
【C++语言】模板(内附精美思维导图)
【C++语言】模板(内附精美思维导图)
|
2天前
|
存储 C++ C语言
【C++语言】动态内存管理
【C++语言】动态内存管理