polymorphism-多态(函数多态、宏多态、静态多态、动态多态)

多态(polymorphism)

字面上意思--多种形态,即同一种方法的行为随上下文而异。

维基百科:Polymorphism (computer science), the ability incomputer programming to present the same interface for differing underlyingforms (data types).

1、函数多态(function polymorphism):也即是函数重载(functionoverloading)

编译器根据参数列表的不同分别编译,生成不同的函数。即对于同一个函数名,编译器根据不同的参数列表可以生成不同的函数。

2、宏多态(macro polymorphism):

编译时,表达式ADD(i1,i2)和ADD(s1,s2)替换成具体表达式。宏多态其实是实现简单的静态多态程序编译时,宏会被替换成具体的表达式,根据形参来标示具体操作

3、静态多态

静态多态本质上就是模板的具现化。编译器处理后,会得到run_vehicle()两个不同的函数。

设计思想 对于相关的对象类型,直接实现它们各自的定义,不需要基类。只是规定各个具体类的实现中相同功能的接口名要相同。静态多态本质上就是模板的具现化,主要通过模板来实现又称编译时多态

4、动态多态:基于继承机制和虚函数

设计思想:对于相关的对象类型,确定它们之间的一个共同功能集,然后在基类中,把这些共同的功能声明为多个公共的虚函数接口。各个子类重写这些虚函数,以完成具体的功能。动态多态基于继承机制和虚函数又称运行时多态

虚函数实现原理框图:

重点:虚函数

静态联编(staticbinding):在编译过程中进行联编;

动态联编(dynamic binding):有虚函数,编译器生成能够在程序运行时选择正确的虚方法的代码。

静态和动态的比较:

不同点

1、本质不同,静态多态在编译期决定,由模板具现完成,而动态多态在运行期决定,由继承、虚函数实现;

2、动态多态中接口是显式的,以函数签名为中心,多态通过虚函数在运行期实现,静态多台中接口是隐式的,以有效表达式为中心,静态多态通过模板具现在编译期完成。

相同点

1、都能够实现多态性,静态多态--编译期多态、动态多态--运行期多态;

2、都能够使接口和实现相分离,一个是模板定义接口,类型参数定义实现,一个是基类虚函数定义接口,继承类负责实现。

时间: 2024-10-13 16:40:54

polymorphism-多态(函数多态、宏多态、静态多态、动态多态)的相关文章

C/C++ 静态多态与动态多态

静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,比如函数的重载. 动态多态则是利用虚函数实现了运行时的多态,也就是说在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会跳转到哪一个函数的栈帧. 虚函数就是在基类中声明该函数是虚拟的(在函数之前加virtual关键字),然后在子类中正式的定义(子类中的该函数的函数名,返回值,函数参数个数,参数类型,全都与基类的所声明的虚函数相同,此时才能称为重写,才符合虚函数,否则就是函数的重载),再定义一个指

018_C语言静态库动态库

 linux下C语言编程环境 头文件目录:/usr/include/ 库目录:/usr/lib/ 动态库与静态库的区别:在计算机程序源代码需要通过翻译.汇编.链接过程而生成可执行文件,再由加载器加载到内存,两者区别就在于程序加载时链接到相应库的方式不同,程序编译时指定了静态库,编译后可直接运行,而编译时指定动态库时,编译后还要先指定库的路径. 静态库: ar -rs libmy_math.a *.o 生成静态库libmy_math.a ar -t 查看静态库 gcc test.c -L. -

C++ 静态多态和动态多态 浅析

今天的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式(object-oriented).函数形式(functional).泛型形式(generic).元编程形式(metaprogramming)的语言. 这些能力和弹性使C++成为一个无可匹敌的工具,但也可能引发使用者的某些迷惑,比如多态.在这几种编程泛型中,面向对象编程.泛型编程以及很新的元编程形式都支持多态的概念,但又有所不同.

静态多态和动态多态

多态 多态就是多种形态,C++的多态分为静态多态和动态多态. 静态多态就是重载,因为是在编译期决议确定,所以称为静态多态. 动态多态就是通过继承重写基类的虚函数实现的多态,因为是在运行时决议确定,所以称为动态多态. class Base { public : virtual void func1() { cout<<"Base::func1" <<endl; } virtual void func2() { cout<<"Base::fun

静态多态与动态多态

面向对象编程的多态从绑定时间来看,可以分成静态多态和动态多态,也称为编译期多态和运行期多态. java中overload是静态多态,即根据参数列表进行最佳匹配,在编译阶段决定要具体执行哪个方法.而与之相反,overriden methods则是在run-time进行动态检查. 举例说明: public class UseAnimals { public void doStuff(Animal a) { System.out.println("Animal"); } public voi

分析多继承下的动态多态。

一.首先我们先了解一下三个概念: 1.重载.2.隐藏.3.覆盖(重写) 如何实现重载?--2个条件: 1-在同一作用域内. 2-两个函数函数名相同,参数不同,返回值可以不同. 此时两个函数就实现了重载,当然这是C++对于C特有的,因为C的时候对参数并没有太多的考虑,C++的编译器在编译时对函数进行了重命名,所以就算是函数名相同的函数,如果参数不同,就会是不同的函数,对应不同的情况. 如何实现隐藏/重定义?--2个条件: 1-在不同作用域下,大多在继承上体现. 2-函数名相同即可. 例如在 B类公

动态多态

public interface Ipower { public abstract void tigongdianyuan(); } 动态多态:指系统A访问系统B的服务时,系统B可以通过多种实现来提供服务,而这一切对于A来说都是透明的 public class ACPower implements Ipower { public void tigongdianyuan() { System.out.println("适配器提供电源"); } } public class Barry i

实验报告(函数与宏定义)

C程序设计实验报告 实验项目:函数的定义和调用 1.编写由三角形三边求面积的函数2.编写求N阶乘的函数3.求两个整数的最大公约数4.打印输出指定图形 姓名:宋梦南       实验地点: 514实验室       实验时间:2019年4月30日 一.实验目的与要求 1.编写由三角形三边求面积的函数 调用area()函数求三角形的面积 在求面积函数运用海伦公式 2.编写求N阶乘的函数 定义符号常量 使用长整型变量存放累乘积 使用全局变量存放累乘积 3.求两个整数的最大公约数 调用bcd()函数求两

第46课 函数与宏分析

1. 函数与宏 (1)宏是由预处理直接替换展开的,编译器不知道宏的存在 (2)函数是由编译器直接编译的实体,调用行为由编译器决定 (3)多次使用宏会导致最终可执行程序的体积增大 (4)函数是跳转执行的,内存中只有一份函数体存在 (5)宏的效率比函数要高,因为是直接展开,无调用开销 (6)函数调用时会创建活动记录,效率不如宏 [编程实验]函数与宏 #include <stdio.h> #define RESET(p,len) while( len > 0) ((char*)p)[--len