1.多态的概念与分类

多态(Polymorphisn)是面向对象程序设计(OOP)的一个重要特征。多态字面意思为多种状态。在面向对象语言中,一个接口,多种实现即为多态。C++ 中的多态性具体体现在编译和运行两个阶段。编译时多态是静态多态,在编译时就可以确定使用的接口。运行时多态是动态多态,具体引用的接口在运行时才能确定。

静态多态和动态多态的区别其实只是在什么时候将函数实现和函数调用关联起来,是在编译时期还是运行时期,即函数地址是早绑定还是晚绑定的。静态多态是指在编译期间就可以确定函数的调用地址,并生产代码,这就是静态的,也就是说地址是早绑定。静态多态往往也被叫做静态联编。 动态多态则是指函数调用的地址不能在编译器期间确定,需要在运行时确定,属于晚绑定,动态多态往往也被叫做动态联编。

2.多态的作用

为何要使用多态呢?封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。静态多态,将同一个接口进行不同的实现,根据传入不同的参数(个数或类型不同)调用不同的实现。动态多态,则不论传递过来的哪个类的对象,函数都能够通过同一个接口调用到各自对象实现的方法。

3.静态多态

静态多态往往通过函数重载和模版(泛型编程)来实现,具体可见下面代码:

#include <iostream>
using namespace std;//两个函数构成重载
int add(int a, int b){cout<<"in add_int_int()"<<endl;return a + b;
}
double add(double a, double b){cout<<"in add_double_doube()"<<endl;return a + b;
}//函数模板(泛型编程)
template <typename T> T add(T a, T b){cout << "in func tempalte" << endl;return a + b;
}int main(){cout<<add(1,1)<<endl;                   //调用int add(int a, int b)cout<<add(1.1,1.1)<<endl;              //调用double add(double a, double b)cout<<add<char>('A',' ')<<endl;     //调用模板函数,输出小写字母a
}

程序输出结果:

in add_int_int()
2
in add_double_doube()
2.2
in func tempalte
a

4.动态多态

动态多态最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而调用不同的方法。如果没有使用虚函数,即没有利用 C++ 多态性,则利用基类指针调用相应函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用同一个函数,这就无法达到“一个接口,多种实现”的目的了。

#include <iostream>
using namespace std;class Base{public:virtual void func(){cout << "Base::fun()" << endl;}
};class Derived : public Base{public:virtual void func(){cout << "Derived::fun()" << endl;}};int main(){Base* b=new Derived;            //使用基类指针指向派生类对象b->func();                       //动态绑定派生类成员函数funcBase& rb=*(new Derived);        //也可以使用引用指向派生类对象rb.func();
}

程序输出结果:

Derived::fun()
Derived::fun()

通过上面的例子可以看出,在使用基类指针或引用指向子类对象时,调用的函数是子类中重写的函数,这样就实现了运行时函数地址的动态绑定,即动态联编。动态多态是通过“继承+虚函数”来实现的,只有在程序运行期间(非编译期)才能判断所引用对象的实际类型,根据其实际类型调用相应的方法。具体格式就是使用 virtual 关键字修饰类的成员函数时,指明该函数为虚函数,并且派生类需要重新实现该成员函数,编译器将实现动态绑定。


参考文献

[1] 浅谈C++多态
[2] 浅谈C++多态性
[3] Effective C++ 中文第三版[M].条款41:了解隐式接口和编译期多态

C++ 多态的两种形式相关推荐

  1. java多态的两种形式_java核心(八):继承与方法重写、final、多态性的两种描述形式...

    一.继承的作用 子类继承父类的属性和方法,实现代码的复用: 子类扩充自己的标准,实现精细化的类型定义. 二.子类构造方法的限制 子类在实例化的时候,默认先实例化父类对象,然后再实例化本类对象: 子类构 ...

  2. c语言中的普通字符包括什么,【判断题】C语言中的字符常量通常有两种形式:普通字符和转义字符。...

    [判断题]C语言中的字符常量通常有两种形式:普通字符和转义字符. 更多相关问题 ---Can you speak French?---Yes, but only____.A.a littleB.lit ...

  3. SQL 关于apply的两种形式cross apply 和 outer apply

    SQL 关于apply的两种形式cross apply 和 outer apply 阅读目录 SQL 关于apply的两种形式cross apply 和 outer apply Sql学习第四天--S ...

  4. 【算法笔记】莫比乌斯反演(包含定理,两种形式的证明及入门经典模板)

    整理的算法模板合集: ACM模板 目录 一.莫比乌斯反演 二.几个概念和定理 三.两种形式的莫比乌斯反演证明 四.POJ 3904 Sky Code(入门例题) 一.莫比乌斯反演 学习笔记,我是看这个 ...

  5. java语言的多态性及特点_Java中的方法的多态性有两种形式:( )和( )。_学小易找答案...

    [填空题]已知函数 ,则微分 . [填空题]. [单选题]71.用转动小滑板法车圆锥时产生( )误差的原因是小滑板转动角度计算错误. [单选题] [填空题]Java中的方法的多态性有两种形式:( )和 ...

  6. Go 两种形式的“类型转换”

    Go 的类型转换常常让人有点迷,有两种形式的"类型转换": Type(obj) :这种形式的类型转换要求 obj 对象的类型和 Type 是等价类型,即实现了相同的方法 obj.( ...

  7. include的两种形式、CPP的搜索路径

    文章目录 1 include的两种形式.CPP的搜索路径 1 include的两种形式.CPP的搜索路径 #include "stdio.h" //1.源文件所在路径//2.-I选 ...

  8. 注意力机制的两种形式

    注意力机制的两种形式: 一.additive attention(tensorflow里面称为Bahdanau attention)        这种机制的定义引用了论文https://arxiv. ...

  9. Python基础day05【函数(函数传参的两种形式、函数形参)、拆包、引用、可变与不可变类型、引用做函数参数注意点】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员]    目录 0.复习 1.函数传参的两种形式[掌握] 2.函数形参 2.1.缺省参数(默认参数) ...

最新文章

  1. Linux中shell命令的用法和技巧
  2. Oracle database 11g 安装 - 配置企业管理器database control失败
  3. 用华为鸿蒙 OS 2.0 系统写出了HelloWorld!那些说鸿蒙是PPT的可以闭嘴了!
  4. hive提交命令org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Error parsing application ID:
  5. c++ 返回数组中最大的值_4个代码块教您如何在C中动态分配2D数组
  6. Educational Codeforces Round 88 (Rated for Div. 2)(AB)
  7. 求二叉树节点个数、叶子节点、节点层次与宽度
  8. 最全中文leetcode解题攻略:思路知识点代码都有,搞定AI大厂笔试
  9. 华为手表表盘的数字什么意思_手表的陀飞轮、月相、逆跳都是什么意思?
  10. 完整的连接器设计手册_连接器卧式插拔力的测试介绍
  11. selenium之HTML元素无法定位
  12. LaTEX 表格内容换行
  13. 破解压缩包、pdf、word 密码【Hashcat + john the ripper】
  14. alpha版、beta版、rc版的意思
  15. 魔兽 服务器 角色 最多,魔兽科普:国服人最多的几个服务器都什么来头
  16. 实现链表的插入——头插/尾插
  17. html 整体缩小zoom,页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
  18. 黑马程序员——C语言学习——概述
  19. Spring系列学习之Spring Cloud Contract测试消息传递
  20. 云计算专业防火墙混合模式应用实验

热门文章

  1. 我要上 Pwn2Own
  2. 天工软件在正射项目中的应用与常见问题解答
  3. 成都睿铂盘点无人机航测三个极端恶劣环境的人员与设备防护指南
  4. 因缺思汀的绕过——实验吧
  5. Java之品优购部署_day01(10)
  6. Python 单元测试
  7. postman使用之二:数据同步和创建测试集
  8. Thinkphp 实现上一篇与下一篇的方法
  9. 简单模拟多线程Socket通信(java)
  10. 1056. 组合数的和(15)-PAT乙级真题