首先回顾一下什么是多态和多态实现的条件:

1.什么是多态:

当父类的指针或者引用指向子类的对象时,在使用父类指针或引用调用一个在父类和各个子类中同名的成员函数时,会根据指向的对象的类型来调用相应类中的成员函数。

2. 多态实现的条件:

  1. 有继承关系。
  2. 父类有虚函数,且子类要重写父类虚函数。
  3. 用父类的指针或引用指向子类的对象。

3.代码解析:

代码:

#include<iostream>
using namespace std;
//父类
class Father
{private:int age;
public:virtual void doSpeaking(){//父类中的虚函数cout<<"father doSpeaking"<<endl;}
};
//子类1
class Son1:public Father{private:int height;public:virtual void doSpeaking(){//子类Son1重写父类虚函数cout<<"son1 doSpeaking"<<endl;}
};
//子类2
class Son2:public Father{private:int weight;public:virtual void doSpeaking(){//子类Son2重写父类虚函数cout<<"son2 doSpeaking"<<endl;}
};
int main(){//创建三个对象Father f;Son1 s1;Son2 s2;//父类引用指向父类对象Father& f1 = f;//父类引用指向子类对象Father& f2 = s1;Father& f3 = s2;f1.doSpeaking();f2.doSpeaking();f3.doSpeaking();return 0;
}

输出结果:

可见f2,f3是父类型的,但调用的doSpeaking函数是根据引用指向的具体对象来决定的。用父类指针指向子类对象同理。

多态实现的原理:

当在运行程序时,编译器发现在父类中有一个虚函数,于是会在类中添加一个隐藏成员:一个指针vptr(virtual poinnter)。该指针指向一个数组,其元素为虚函数的地址。这个数组也叫虚函数表。

在虚函数表中依次为类中虚函数的地址。

当子类中也有一个类似的指针指向一个另一个虚函数表,该虚函数表复制了父类的虚函数表,如果子类中重写了父类的虚函数,子类中重写的函数地址将会覆盖掉原来的地址,若没有重写,虚函数地址将保持不变。同样如果子类中有新的虚函数也会添加到虚函数表后面。

当父类的指针或引用指向子类的对象时,会找到对象的成员vptr,并顺着vptr指向的地址找到虚函数表,在通过父类指针或引用调用函数时会找到表中相应函数的地址并顺着地址找到函数来执行。

c++:多态是什么,多态的实现原理相关推荐

  1. c++中的多态---1(多态概念,静态联编和动态联编,多态原理解析,重载,重写,重定义的对比)

    多态的基本概念 多态是面向对象设计语言数据抽象和继承之外的第三个基本特征 多态性(polymorphism)提供接口与具体实现之间的另一层隔膜,从而将"what"和"ho ...

  2. 多态的概念,多态的原理,多态解决什么问题

    目录 一.多态能解决什么问题 二.多态的概念 三,多态的原理 一.多态能解决什么问题 问题:通过基类指针只能访问派生类的成员变量,不能访问派生类的成员函数 (包括析构函数也不能访问)----(这也是为 ...

  3. C++静态多态(模版模拟多态)的讨论

    说到面向对象特性之一"多态",以我的水平已经说不出太多新意了.相信很多程序员代码K多了,做梦都在"多态中"运行着.常规的多态是C++语义内置支持的一种特性,通过 ...

  4. 中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第六周 多态 笔记 之 多态实例:魔法门之英雄无敌

    第六周 多态 1.虚函数和多态的基本概念 2.多态实例:魔法门之英雄无敌 3.更多多态程序实例 4.多态的实现原理 5.虚析构函数.纯虚函数和抽象类 2.多态实例:魔法门之英雄无敌 游戏中有很多种怪物 ...

  5. java 多态_Java面向对象 —— 多态

    前两天已经相继介绍了Java面向对象的三大特性之中的封装.继承,所以今天就介绍Java面向对象的三大特性的最后一项,多态~ 首先讲一下什么是多态,以及多态需要注意的细节 什么是多态:一个对象具备多种形 ...

  6. C++编译时多态和运行时多态

    C++编译时多态和运行时多态 作者:melonstreet 出处:https://www.cnblogs.com/QG-whz/p/5132745.html 本文版权归作者和博客园共有,欢迎转载,但未 ...

  7. c++ 多态 运行时多态和编译时多态_C++学习笔记之多态

    多态是面向对象三大特性之一 多态分为两类: 静态多态:函数重载 和 运算符重载 属于静态多态,复用函数名 动态多态:派生类 和 虚函数 实现运行时多态 静态多态和动态多态的区别: 静态多态的函数地址早 ...

  8. C++知识点 多态、静态多态、动态多态

    多态 有了继承才有多态的概念,首先说一下继承. 继承的概念是派生类可以调用基类的成员.常举的例子,动物是基类,它拥有所有动物共有的一些特征和方法.它会衍生出猫的类,狗的类,派生出的类除了有动物公共的特 ...

  9. java面向对象三大特性之多态---编译时多态和运行时多态详解

    一.引言 1.什么是多态? 说到重载和重写,大家可能都知道.它们都是多态性的体现,那么说什么是多态呢?多态是指允许不同子类型的对象对同一行为作出不同的响应.例如在生活中,比如跑的动作,小猫.小狗和大象 ...

  10. C++ 多态(动态多态)

    本文结合黑马程序员.C语言中文网以及<C++ Primer>对多态进行了总结 多态的基本概念 多态是C++面向对象三大特性之一. 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态 ...

最新文章

  1. 刚刚 ECCV 2020放榜!新鲜论文出炉啦!(附部分论文和代码汇总)
  2. Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地
  3. Ftp上传类(FtpClient)
  4. python代码基础题-python3的基础练习题
  5. css撑起父元素清除浮动的问题
  6. 用python处理excel的基本语法_《使用python3读取处理excel表的数据内容如何对内容求平均值》 用python读取excel文件...
  7. 开发函数计算的正确姿势——借助 Ghostscript 将 PDF 转换成 JPG
  8. android标题栏上增加按钮,Android:向自定义标题栏添加按钮
  9. js的tree数组对象扁平化思否_js 中的tree型数组如何去重与合并?
  10. 日志收集神器 Logstash,闪亮登场~
  11. pe卸载win10更新补丁_禁用Win10系统更新
  12. oracle 12c的PDB数据库未打开
  13. 单片机简易开发板怎么设计,我来告诉你
  14. php 抽奖活动_PHP实现活动人选抽奖功能
  15. Centos下rarcrack破解压缩包密码
  16. 自动控制原理:如何用折线式伯德图计算截止频率?
  17. DDR 内存与 PCB 设计挑战
  18. OpenAI Whisper探索(一)
  19. UCanCode发布领先的大型组态建模仿真CAD与GIS开源套件2019版本
  20. 2020.05.29

热门文章

  1. tar中的参数 cvf,xvf,cvzf,zxvf的使用
  2. 我的平面设计作品之:公司徽标类
  3. 融云--如何显示用户昵称和头像的
  4. linux vsftpd 磁盘限额,[转载]Serv-U组建FTP使用磁盘限额的解决方法
  5. 0e开头MD5值小结
  6. Redis 布隆过滤器实战「缓存击穿、雪崩效应」
  7. (:◎)≡前端学习之CsS篇
  8. php空间200m,免费提供大家200M php+mysql空间!
  9. 迷途的测试老鸟如何振翅高飞
  10. gcc:内存问题检查选项 -fsanitize; asan