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

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

多态


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


动态联编(动态多态)

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


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


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

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


静态联编(静态多态)

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


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


特设多态

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


参数多态

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


包含多态

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


多态、重写、重载的区别

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


目录
相关文章
|
1月前
|
编译器 C++
c++中的多态
c++中的多态
|
12天前
|
存储 编译器 C++
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本文介绍了面向对象编程中的多态特性,涵盖其概念、实现条件及原理。多态指“一个接口,多种实现”,通过基类指针或引用来调用不同派生类的重写虚函数,实现运行时多态。文中详细解释了虚函数、虚函数表(vtable)、纯虚函数与抽象类的概念,并通过代码示例展示了多态的具体应用。此外,还讨论了动态绑定和静态绑定的区别,帮助读者深入理解多态机制。最后总结了多态在编程中的重要性和应用场景。 文章结构清晰,从基础到深入,适合初学者和有一定基础的开发者学习。如果你觉得内容有帮助,请点赞支持。 ❤❤❤
91 0
|
4月前
|
存储 编译器 数据安全/隐私保护
【C++】多态
多态是面向对象编程中的重要特性,允许通过基类引用调用派生类的具体方法,实现代码的灵活性和扩展性。其核心机制包括虚函数、动态绑定及继承。通过声明虚函数并让派生类重写这些函数,可以在运行时决定具体调用哪个版本的方法。此外,多态还涉及虚函数表(vtable)的使用,其中存储了虚函数的指针,确保调用正确的实现。为了防止资源泄露,基类的析构函数应声明为虚函数。多态的底层实现涉及对象内部的虚函数表指针,指向特定于类的虚函数表,支持动态方法解析。
49 1
|
5月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
75 2
C++入门12——详解多态1
|
5月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
109 1
|
7月前
|
Java 开发者
【Java基础面试十五】、 说一说你对多态的理解
这篇文章解释了多态性的概念:在Java中,子类对象可以赋给父类引用变量,运行时表现出子类的行为特征,从而允许同一个类型的变量在调用同一方法时展现出不同的行为,增强了程序的可扩展性和代码的简洁性。
【Java基础面试十五】、 说一说你对多态的理解
|
7月前
|
Java
【Java基础面试十六】、Java中的多态是怎么实现的?
这篇文章解释了Java中多态的实现机制,主要是通过继承,允许将子类实例赋给父类引用,并在运行时表现出子类的行为特征,实现这一过程通常涉及普通类、抽象类或接口的使用。
|
8月前
|
存储 编译器 C++
【C++】深度解剖多态(下)
【C++】深度解剖多态(下)
83 1
【C++】深度解剖多态(下)
|
7月前
|
存储 编译器 C++
|
8月前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)