多态是面向对象三大特性之一

多态分为两类:

  • 静态多态:函数重载 和 运算符重载 属于静态多态,复用函数名
  • 动态多态:派生类 和 虚函数 实现运行时多态

静态多态和动态多态的区别:

  • 静态多态的函数地址早绑定,编译阶段就确定了函数的地址
  • 动态多态的函数地址晚绑定,运行阶段才确定函数的地址

代码案例如下:

#include <iostream>using namespace std;// 定义一个动物类
class Animal
{
public:// 虚函数,表示晚绑定(动态绑定)virtual void speak(){cout << "动物会说话" << endl;}
};// 猫类
class Cat:public Animal
{
public:void speak()    // 也可这么写:visual void speak(){cout << "小猫在说话" << endl;}
};// 狗类
class Dog:public Animal
{
public:virtual void speak()    // 前面的 virtual 可写可不写{cout << "小狗在说话" << endl;}
};// 满足 动态多态 的条件
// 1. 有继承关系
// 2. 子类重写父类的虚函数(子类重写的函数前的 virtual 可加可不加)// 执行说话函数
// 这种写法,地址早绑定,编译阶段确定函数地址
// 如果想执行让猫说话,那么这个函数地址不能提前绑定,需要在运行阶段绑定,地址晚绑定(即在动物类的speak改为虚函数)
void doSpeak(Animal &animal)    // 父类的指针或者引用 指向子类对象
{animal.speak();
}void test01()
{Cat cat;doSpeak(cat);Dog dog;doSpeak(dog);
}int main(int argc, char const *argv[])
{/* code */test01();return 0;
}

c++ 多态 运行时多态和编译时多态_C++学习笔记之多态相关推荐

  1. 常见的运行时异常与编译时异常举例

    常见的运行时异常与编译时异常举例 参考文章: (1)常见的运行时异常与编译时异常举例 (2)https://www.cnblogs.com/william-dai/p/9255158.html (3) ...

  2. Java——异常——运行时异常与编译时异常

    Java--异常--运行时异常与编译时异常 ①编译时异常 1.经常会在程序编译时产生一些异常,而这些异常必须要进行处理,这种异常被称为编译时异常,也称为checked异常. 2.在Java中,Exce ...

  3. 2022Java学习笔记七十三(异常处理:运行时异常、编译时异常、异常的默认处理的流程)

    2022Java学习笔记七十三(异常处理:运行时异常.编译时异常.异常的默认处理的流程) 一.异常体系 1.Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题 2.R ...

  4. 基于ubuntu-20.04.3的snort+Barnyard2+BASE的入侵检测系统安装时Barnyard2反编译时出错解决

    基于ubuntu-20.04.3的snort+Barnyard2+BASE的入侵检测系统安装时Barnyard2反编译时出错解决 在按照https://www.modb.pro/db/159797大佬 ...

  5. 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )

    文章目录 一.在 MyASTTransformation#visit 方法中进行方法注入 1.使用 new AstBuilder().buildFromSpec 进行方法注入 2.使用 new Ast ...

  6. 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )

    文章目录 一.在 MyASTTransformation#visit 方法中进行方法拦截 二.完整代码示例及进行编译时处理的编译过程 1.Groovy 脚本 Groovy.groovy 2.ASTTr ...

  7. 动态so库的链接:运行时链接和编译时链接

    在编写Makefile时,如果一个程序需要链接so库,则需要通过两个步骤来完成,分为运行时动态库的链接和编译时动态库的链接,缺一不可. 1.运行时动态库的链接 在执行可执行文件时,提示: error ...

  8. vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)

    vc++编译时运行库选择(/MT/MTd/MD/MDd) vc++编译时运行库选择(/MT./MTd./MD./MDd) 在vs中,项目属性 ->C/C++ ->代码生成 ->运行库 ...

  9. 【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )

    文章目录 一.编译时元编程引入 二.声明需要编译时处理的类 三.分析 Groovy 类的 AST 语法树 一.编译时元编程引入 在之前的 " [Groovy]MOP 元对象协议与元编程 &q ...

最新文章

  1. 2021下半年,我只想用Python搞钱!
  2. Nature综述: 地球上细菌和古菌的生物膜丰度
  3. Ubuntu 创建文件快捷方式 启动器
  4. Spring 初识Aop JDK动态代理实现 原理初显
  5. 如何快速掌握oracle,教你如何快速从 Oracle 官方文档中获取需要的知识
  6. arm中clz指令_JavaScript中带有示例的Math.clz32()方法
  7. 15-mysql-进阶九-联合查询
  8. kafka 多线程消费
  9. 深化管理、提升IT的数据平台建设方案
  10. 天线学习笔记——HFSS简单阵列天线
  11. 期货反跟单-镜像零滑点软件真有那么靠谱吗?
  12. 暗影精灵3 PLUS 安装黑苹果
  13. 车辆信息查询api,通过车系名称查询相关信息
  14. 解决matlab2019b中文乱码问题
  15. 参加了一场温州游资的婚礼,也太壕了
  16. lamp架构部署 httpd编译、mysql二进制、php编译 网页访问效果
  17. 阿里双十一购物节背后的技术问题
  18. 微信小程序音乐播放器系统app毕业设计
  19. 尤雨溪:TypeScript不会取代JavaScript
  20. pointer在html作用,详解pointer-events属性的使用

热门文章

  1. 粉丝福利,送10个程序员专用机械键盘
  2. Jack Dorsey二度卸任推特CEO,原CTO接棒,立即生效!
  3. 美团配送A/B平台评估体系建设与实践
  4. 【jeecg Docker安装】使用 Docker 搭建 Java Web 运行环境
  5. 根据hibernate拦截器实现可配置日志的记录
  6. python设计模式总结
  7. 编译安装Mysql5.6.36
  8. Spring Boot 学习(一) 快速搭建SpringBoot 项目
  9. 修复Jscript(IE浏览器脚本引擎)异常
  10. 阿里发布《2015-2016中国云栖创新报告》,北上杭深广排名前5