原文地址:https://qunxinghu.github.io/2016/09/08/C++%20%E4%B8%89%E5%A4%A7%E7%89%B9%E6%80%A7%E4%B9%8B%E5%A4%9A%E6%80%81/

概念

多态(Polymorphisn)

多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说:允许将子类类型的指针赋值给父类类型的指针(一个接口,多种方法)。
C++ 支持两种多态性:编译时多态性,运行时多态性。
a、编译时多态性(静态多态):通过重载函数实现
b、运行时多态性(动态多态):通过虚函数实现。

多态的作用

那么多态的作用是什么呢,封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。

多态的用法

运行时多态:

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

非运行时多态:

通过函数重载实现

简而言之:

  1. 有virtual才可能发生动态多态现象
  2. (无virtual)调用就按原类型调用

令人迷惑的隐藏规则

隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

  • 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆,重载是在同一个类中,而隐藏涉及派生类与基类)。
  • 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆,覆盖有virtual关键字)。

C++虚函数

虚函数: 就是允许被其子类重新定义的成员函数,子类重新定义父类虚函数的做法,可实现成员函数的动态覆盖(Override)。

纯虚函数: 是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”

virtual void funtion()=0

抽象类: 包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能进行实例化。

纯虚函数的作用:

  1. 为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
  2. 在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
    为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。

示例代码:

#include<iostream>
using namespace std;//基类对象
class Base
{
public://有virtual关键字,运行时多态virtual void f(float x){cout<<"Base::f(float)"<< x <<endl;}//无viratul关键字,不会发生运行时多态void g(float x){cout<<"Base::g(float)"<< x <<endl;}void h(float x){cout<<"Base::h(float)"<< x <<endl;}
};
class Derived : public Base
{
public:virtual void f(float x){cout<<"Derived::f(float)"<< x <<endl;   //多态、覆盖}//子类与父类的函数同名,无virtual关键字,则为隐藏void g(int x){cout<<"Derived::g(int)"<< x <<endl;     //隐藏}void h(float x){cout<<"Derived::h(float)"<< x <<endl;   //隐藏}
};
int main(void)
{Derived d;  //子类Base *pb = &d;  //基类指针指向子类Derived *pd = &d;   //子类指针指向自己// Good : behavior depends solely on type of the objectpb->f(3.14f);   // Derived::f(float) 3.14   调用子类,多态pd->f(3.14f);   // Derived::f(float) 3.14   调用子类// Bad : behavior depends on type of the pointerpb->g(3.14f);   // Base::g(float)  3.14 无多态,调用自己的pd->g(3.14f);   // Derived::g(int) 3    无多态,调用自己的// Bad : behavior depends on type of the pointerpb->h(3.14f);   // Base::h(float) 3.14  无多态,调用自己的pd->h(3.14f);   // Derived::h(float) 3.14   无多态,调用自己的return 0;
}

转载于:https://www.cnblogs.com/quincyhu/p/5867504.html

C++三大特性之多态相关推荐

  1. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  2. polymorphism java_Java基础-面向对象第三大特性之多态(polymorphism)

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  3. 面向对象的三大特性之多态

    面向对象的三大特性之多态 文章目录 面向对象的三大特性之多态 前言 一.静态多态 1.函数重载 2.函数模板 二.动态多态 1.函数重写 2.虚函数的继承特性 三.重定义 前言 多态的简单定义为同一种 ...

  4. java提高篇四_(转)java提高篇(四)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  5. Java提高篇 —— Java三大特性之多态

    一.前言 面向对象编程有三大特性:封装.继承.多态. 封装:隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问 ...

  6. 面向对象的三大特性之多态,封装基础

    面向对象的三大特性  :  继承    多态    封装 多态:一个类表现出多种形态:通过继承来实现的 在python中:由于函数的参数不需要指定数据类型,所以也不需要通过继承的形式来统一一组类的类型 ...

  7. 面向对象三大特性(多态)

    一.今日回顾: 1.课程: <高等数学>,写了关于函数极值与最值,凹凸性的题目.从小学到大,第一次感觉到学习是一件非常考验定力的事情. 2.阅读: <java核心技术>< ...

  8. 理解Java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  9. java提高篇(三)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  10. java多态基础_java基础(三)-----java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

最新文章

  1. 通过timer控件和窗体的opacity属性,轻松实现窗体的淡入淡出
  2. ALV分类合计功能实现
  3. feign一个接口多个方法_spring cloud 建一个服务消费者client-feign(最好用这种方式)...
  4. 影响个人计算机系统功能的因素,影响个人计算机系统功能的因素除了系统使用哪种位的微处理器外,还有CPU的时钟频率、CPU主内存容量、CPU所能提供的指令集。...
  5. 捡起JavaScript(1)
  6. 39个史诗级奇葩代码注释,程序不会崩,但程序员会
  7. ubuntu网站收集
  8. 【英语学习】【科学】【Glencoe Science】【A】Life's Structure and Function目录及术语表
  9. 【备忘】高斯判别分析(GDA)参数手推记录
  10. python数据结构与算法 pdf_数据结构与算法:Python语言描述.pdf
  11. 电路城 电路方案 51单片机开发板(原理图+PCB+学习程序源文件)
  12. opencv将多张图片合成视频
  13. Redis实战篇(四)
  14. 如何获取天猫/淘宝商品历史价格信息
  15. 家具力学性能测试软件,家具力学性能
  16. PRN(20210426):Online Continual Learning with Maximally Interfered Retrieval
  17. linux操作命令comm,一天一个shell命令 文本操作系列-comm命令用法
  18. 对接阿里云sms短信服务发送验证码
  19. Ubuntu操作系统位数及版本
  20. 安卓一键清理内存_雨点清理app下载-雨点清理 安卓版v1.0

热门文章

  1. 关于SQL语句中的双引号、单引号和
  2. 微信小程序入门 ——增删改查+页面跳转+传值取值+布局样式
  3. Eclipse 编译项目
  4. Redisbook学习笔记(3)数据类型之列表
  5. [20170828]grep过滤技巧.txt
  6. 用vertx compose写链式操作
  7. noi 9271 奶牛散步
  8. Flex4 在advanceddatagrid组件中以“树形结构”显示数据
  9. 物联网卡产品的应用和拓展
  10. 怎么使用starwind部署iscsi_服务器配置我该怎么选