C/C++面试题:如何理解多态?

简介: C/C++面试题:如何理解多态?

多态


多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
在编程语言和类型论中,多态指为不同数据类型的实体提供统一的接口.
多态分为动态动态和静态多态.


动态联编(动态多态)

编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序运行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行,这种在程序运行时进行联编工作被称为动态联编。


在C++中,运行时多态性是通过虚函数来实现的。


  • 定义: 同一操作作用于不同的对象,产生不同的执行结果。意味着当调用虚成员函数时,会根据调用类型对象的实际类型执行不同的操作。
  • 实现:通过虚函数实现,用virtual声明的成员函数就是虚函数,允许子类重写。声明基类的指针或者引用指向不同的子类对象,调用相应的虚函数,可以根据指针或引用指向的子类的不同从而执行不同的操作。

对于类的多态性,一定是基于虚函数表的,那么虚函数表的实现一定是动态联编的,因此也不可缺少虚函数指针寻址的过程,那么我们要实现动态联编,就需要用到指针或者引用的形式。


静态联编(静态多态)

在编译时所进行的这种联编又称静态束定,在编译时就解决了程序中的操作调用与执行该操作代码间的关系。


在C++中,编译时多态性是通过函数重载和模板实现的。利用函数重载机制,在调用同名函数时,编译系统会根据实参的具体情况确定索要调用的是哪个函数。


特设多态

函数重载属于一种多态,叫做特设多态(Ad hoc polymorphism)。特设多态的意思是,一个函数有,有限数量的多种不同的实现,依赖参数的类型来选择调用特定版本的函数实现。这种选择在编译期就可以判断,所以称为静态多态。 C++ 里的函数重载和运算符重载都是 特设多态。


参数多态

参数多态就是定义类型时候,或者某个类型的实现时候(比如类,函数,变量等)保留类型参数,等以后在使用时候,由程序员或者编译器补上适当的类型参数。有时候也会被叫做泛型编程。一般这也是编译期决定的,也是静态多态 B 是 A 的子类型(分为名义子类型和结构子类型,名义子类型就是必须显式声明子类型关系,结构子类型就是只要满足接口一致就自动实现了子类型关系),所有使用 A 的地方我们都可以用 B 去安全替换上 。


包含多态

包含多态就是,同样的操作,我们可以作用于 A 和 A 的所有子类型(比如B)上。在包含多态中,由于值是不定类型的,可能是任何的子类型,实现也可能是任意子类型中配套的任意实现,我们编译期拿不到足够的信息,所以需要运行时通过动态分派查找具体的类型对应的实现(比如 C++ 的 VTable 和 JavaScript 的原型链),所以包含多态是动态多态。


多态、重写、重载的区别

  • 多态(狭义上的):同一个方法对不同的对象调用行为不同的现象。
  • 重写:同一方法在不同类中的重新实现。
  • 重载:不同的方法。


目录
相关文章
|
29天前
|
C++
9. C++虚函数与多态
9. C++虚函数与多态
27 0
|
1月前
|
算法 Java 编译器
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
25 0
|
5天前
|
编译器 C++
c++的学习之路:23、多态(2)
c++的学习之路:23、多态(2)
17 0
|
30天前
|
编译器 C++
C++之多态
C++之多态
|
1月前
|
存储 程序员 编译器
【C++ 模板类与虚函数】解析C++中的多态与泛型
【C++ 模板类与虚函数】解析C++中的多态与泛型
46 0
|
1月前
|
敏捷开发 安全 API
C/C++ 工程师面试:如何精彩展示你的项目经验并获得高分
C/C++ 工程师面试:如何精彩展示你的项目经验并获得高分
73 0
|
1月前
|
设计模式 存储 安全
【C++ 基本概念】C++编程三剑客:模板、多态与泛型编程的交织与差异
【C++ 基本概念】C++编程三剑客:模板、多态与泛型编程的交织与差异
106 0
|
1月前
|
存储 安全 算法
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
50 1
|
1月前
|
存储 算法 编译器
【C++ 模板应用】模板哪些行为属于多态哪些行为属于泛型编程?
【C++ 模板应用】模板哪些行为属于多态哪些行为属于泛型编程?
26 0
|
1月前
|
存储 安全 编译器
【C++ 多态 】深入理解C++的运行时类型信息(RTTI):dynamic_cast和typeid的应用与原理
【C++ 多态 】深入理解C++的运行时类型信息(RTTI):dynamic_cast和typeid的应用与原理
54 1