首页 > 其他分享 >多态

多态

时间:2024-08-02 10:10:06浏览次数:5  
标签:函数 对象 子类 多态 类型 方法

多态(Polymorphism)

多态(Polymorphism)是面向对象编程中的一个核心概念,它指的是同一种类型的对象在不同的情况下表现出不同的行为。以下是对多态概念的详细解释:

一、多态的定义

  • 基本定义:多态通俗来说就是多种形态,具体表现为去完成某个行为时,当不同的对象去完成时会产生出不同的状态。在编程语言和类型论中,多态指为不同数据类型的实体提供统一的接口。
  • 专业解释:多态类型(Polymorphic Type)可以将自身所支持的操作套用到其它类型的值上。在程序运行时,相同的消息可能会发送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,从而产生不同的行为。

二、多态的分类

多态可分为多种类型,主要包括:

  • 变量多态:基类型的变量(如C++中的引用或指针)可以被赋值基类型对象,也可以被赋值派生类型的对象。
  • 函数多态:相同的函数调用界面(函数名与实参表),传送给一个对象变量时,可以有不同的行为,这取决于该对象变量所指向的对象类型。
  • 动态多态:通过类继承机制和虚函数机制生效于运行期,可以优雅地处理异质对象集合。
  • 静态多态:基于模板的多态,处理于编译期而非运行期,如C++中的模板和函数重载。

三、多态的实现

多态的实现通常依赖于继承和方法重写(Override)的特性:

  • 继承:子类继承自父类,从而获得父类的属性和方法。
  • 方法重写:子类可以重写父类中的方法,使得在调用该方法时,根据对象的实际类型(即子类类型)来执行相应的实现。

四、多态的优点

  • 提高代码的可扩展性:通过多态,可以在不修改现有代码的情况下,添加新的子类并实现相同的方法,从而扩展系统的功能。
  • 提高代码的复用性:使用父类引用可以操作多种类型的子类对象,减少了代码的重复编写。
  • 提高代码的可维护性:多态使得系统更加灵活,易于维护和修改。

五、多态的示例

假设有一个动物(Animal)类,以及由动物类继承而来的鸡(Chicken)类和狗(Dog)类。每个类都有一个“叫()”的方法,但具体实现不同:鸡类实现为“啼叫()”,狗类实现为“吠叫()”。这就是多态的一个典型示例,即相同的消息(调用“叫”方法)发送给不同的对象(鸡或狗),会产生不同的行为(啼叫或吠叫)。

六、总结

多态是面向对象编程中一个非常重要的概念,它允许使用统一的接口来操作不同类型的对象,并根据对象的实际类型来执行相应的操作。通过多态,可以提高代码的可扩展性、复用性和可维护性,使得系统更加灵活和易于管理。

七.多态的机制原理

1.动态绑定(晚期绑定)

多态的实现依赖于动态绑定(也称为晚期绑定)。在编译时,编译器无法确定将要调用哪个类的方法,因为具体的对象类型是在运行时确定的。因此,编译器会生成一种特殊的代码,这种代码能够在运行时确定对象的实际类型,并调用相应的方法。

2.虚函数表(vtable)

在C++等语言中,多态的实现通常依赖于虚函数表(vtable)。当一个类包含虚函数时,编译器会为该类创建一个虚函数表,表中存储了该类所有虚函数的地址。每个类的对象都会包含一个指向其所属类虚函数表的指针(vptr)。当通过基类类型的引用或指针调用虚函数时,程序会根据该引用或指针所指向对象的vptr找到对应的虚函数表,并从表中获取要调用的虚函数的地址,然后执行该函数。

多态的机制原理主要涉及到继承、方法重写和动态绑定等方面。通过继承,子类获得了父类的属性和方法;通过方法重写,子类可以提供与父类方法不同的实现;通过动态绑定和虚函数表,程序能够在运行时确定对象的实际类型,并调用相应的方法。这些机制共同构成了多态的基础,使得面向对象编程更加灵活和强大。

标签:函数,对象,子类,多态,类型,方法
From: https://www.cnblogs.com/yhy373286277/p/18338091

相关文章

  • 多态
    多态1.多态的概念多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作,如下图多态性是对象多种表现形式的体现。现实中,比如我们按下F1键这个动作:如果当前在Flash界面下弹出的就是AS3的帮助文档;如果当前在Word下......
  • 【C++】多态
    什么是多态?就是不同对象在完成某个行为时,会产生不同的形态多态分为静态多态和动态多态静态多态在编译期间就确定执行哪个函数,主要包含:函数重载和运算符重载静态多态函数的地址早绑定-在编译阶段确定函数的地址动态多态派生类和虚函数实现的运行阶段的多态动态多态函数......
  • 深入探讨C++编译期多态:提高效率与安全性
    目录一、引言二、编译期多态技术详解函数重载(FunctionOverloading)运算符重载(OperatorOverloading)模板元编程(TemplateMetaprogramming)使用std::enable_if实现条件模板特化使用ifconstexpr实现编译期条件分支SFINAE(SubstitutionFailureIsNotAnError)CRTP(Curious......
  • Java--多态和抽象类
    目录多态实现多态的条件重写重写和重载静态绑定和动态绑定向上转型和向下转型向上转型向下转型instanceof抽象类多态在Java中多态就是在完成一件事的时候,不同人去完成产生的结果不同比方说打印,我们就是要打印一个东西,如果我们交给彩色打印机,那么会打印出来彩色......
  • 代码大全多态
    尽量使用多态,避免大量的类型检查频繁重复出现的case语句有时是在暗示,采用继承可能是种更好的设计选择--尽管并不总是如此   在面向对象编程中,多态是一种允许你通过一个接口使用多种类型对象的方法。在你提供的例子中,使用`switch`或`case`语句来根据不同的形状类型调......
  • Java多态----继承
    一、基本概念关键字:extends    在java中,一个类(类A)继承另一个类(类B)是指类A能够直接使用类B的所有非构造方法和所有非私有属性(注意:不是不能使用是不能直接使用),并在类B原有的基础上继续进行扩充和延伸,即关键字extends的含义。通常,我们称类A与类B的关系为继承关系,继承方(......
  • Java多态----重写
    一、重写与重载    在学习重写之前,我们需要将它和重载进行区分:方法的重载,发生在同一个类中,方法名相同,参数列表不同,返回值无关。可参考上一篇文章中一个类中不同的构造方法,其也属于重载。详情可见于Java多态----继承-CSDN博客-------------------------------------......
  • Java基础第四弹-----多态、抽象类、接口和异常
    文章目录Java基础知识全解第四弹一、final1.概述2.使用场景3.总结二、继承中的构造方法三、前景知识1.Object2.toString()3.instanceof4.equals()四、多态1.多态定义2.多态条件3.两种转型方式3.1向上转型3.2向下转型4.为什么要转型五、抽象类1.定义2.格式3.抽象......
  • 小一保姆级 python三大核心多态、抽象类、动态添加内容详解
    一.多态多态是面向对象编程中的一个核心概念,它允许一个接口被多个数据类型实现。这意味着,即使多个类具有不同的内部实现,它们也可以共享一个公共接口。多态的实现通常依赖于继承和方法重写。继承:子类继承父类的属性和方法。方法重写:子类重写父类中的方法,以提供特定的实现。......
  • C++ 多态
    多态基本概念多态是C++面向对象三大特性之一多态分为两类静态多态:函数重载和运算符重载属于静态多态,复用函数名动态多态:派生类和虚函数实现运行时多态静态多态和动态多态区别:静态多态的函数地址早绑定——编译阶段确定函数地址动态多态的函数地址晚绑定——运行阶段确......