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

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. struts+spring+hibernate总结
  2. c#split方法拆分为数据_Dexplot:基于pandas,比matplotlib更简单的数据可视化和数据分析工具...
  3. C语言ODBC数据库操作
  4. 带圆圈大小的散点图_Python数据可视化,Matplotlib绘制“散点图”的两种方法!...
  5. T T[] toArray(T[] a);
  6. 支付宝pc支付php,laravel框架下的pc支付宝支付接入
  7. JAVA编程心得-Eclipse/MyEclipse 中文乱码解决办法
  8. SpringMVC日期类型转换问题处理方法归纳
  9. android 8.0 行为变更--day03
  10. 仅为代码实际运行资源付费 解构国内首个函数计算
  11. Kibana饼图介绍
  12. 计算机应用用英语,计算机应用常用英语:“windows”
  13. 小米路由器mini R1C R1CM openwrt源 换源
  14. 1024程序员节带你玩转图片Exif信息获取之JavaScript
  15. 苹果铃声制作(流水是操作记录)
  16. 《富爸爸穷爸爸》读书笔记 -- 第一章
  17. 说一个岛上有100个人,其中有5个红眼睛
  18. When you gather it, things would be counted. ​​​​
  19. Nachos指南(一)
  20. 组合计数------牡牛和牝牛

热门文章

  1. 利用MS11_003 IE漏洞攻击Windows7主机-代号 永恒之蓝
  2. 使用逻辑回归和词向量进行(英文)电影评论情感(二)分类
  3. HOOK API 的几种方式
  4. Excel学习笔记:P37-这是什么巫术?我弄半天的表格,结果旁边的同事弹指一挥间就全部做好了!
  5. 【图论搜索专题】如何使用「双向 BFS」解决搜索空间爆炸问题
  6. Android——浅析Activity过渡动画
  7. ElementUI过渡动画篇
  8. 中国消费电子高频主轴市场趋势报告、技术动态创新及市场预测
  9. Unity(9)-TileMap瓦片地图
  10. el-table 设置一列的颜色