c++ 多态 运行时多态和编译时多态_C++学习笔记之多态
多态是面向对象三大特性之一
多态分为两类:
- 静态多态:函数重载 和 运算符重载 属于静态多态,复用函数名
- 动态多态:派生类 和 虚函数 实现运行时多态
静态多态和动态多态的区别:
- 静态多态的函数地址早绑定,编译阶段就确定了函数的地址
- 动态多态的函数地址晚绑定,运行阶段才确定函数的地址
代码案例如下:
#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)常见的运行时异常与编译时异常举例 (2)https://www.cnblogs.com/william-dai/p/9255158.html (3) ...
- Java——异常——运行时异常与编译时异常
Java--异常--运行时异常与编译时异常 ①编译时异常 1.经常会在程序编译时产生一些异常,而这些异常必须要进行处理,这种异常被称为编译时异常,也称为checked异常. 2.在Java中,Exce ...
- 2022Java学习笔记七十三(异常处理:运行时异常、编译时异常、异常的默认处理的流程)
2022Java学习笔记七十三(异常处理:运行时异常.编译时异常.异常的默认处理的流程) 一.异常体系 1.Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题 2.R ...
- 基于ubuntu-20.04.3的snort+Barnyard2+BASE的入侵检测系统安装时Barnyard2反编译时出错解决
基于ubuntu-20.04.3的snort+Barnyard2+BASE的入侵检测系统安装时Barnyard2反编译时出错解决 在按照https://www.modb.pro/db/159797大佬 ...
- 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )
文章目录 一.在 MyASTTransformation#visit 方法中进行方法注入 1.使用 new AstBuilder().buildFromSpec 进行方法注入 2.使用 new Ast ...
- 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )
文章目录 一.在 MyASTTransformation#visit 方法中进行方法拦截 二.完整代码示例及进行编译时处理的编译过程 1.Groovy 脚本 Groovy.groovy 2.ASTTr ...
- 动态so库的链接:运行时链接和编译时链接
在编写Makefile时,如果一个程序需要链接so库,则需要通过两个步骤来完成,分为运行时动态库的链接和编译时动态库的链接,缺一不可. 1.运行时动态库的链接 在执行可执行文件时,提示: error ...
- vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)
vc++编译时运行库选择(/MT/MTd/MD/MDd) vc++编译时运行库选择(/MT./MTd./MD./MDd) 在vs中,项目属性 ->C/C++ ->代码生成 ->运行库 ...
- 【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )
文章目录 一.编译时元编程引入 二.声明需要编译时处理的类 三.分析 Groovy 类的 AST 语法树 一.编译时元编程引入 在之前的 " [Groovy]MOP 元对象协议与元编程 &q ...
最新文章
- 2021下半年,我只想用Python搞钱!
- Nature综述: 地球上细菌和古菌的生物膜丰度
- Ubuntu 创建文件快捷方式 启动器
- Spring 初识Aop JDK动态代理实现 原理初显
- 如何快速掌握oracle,教你如何快速从 Oracle 官方文档中获取需要的知识
- arm中clz指令_JavaScript中带有示例的Math.clz32()方法
- 15-mysql-进阶九-联合查询
- kafka 多线程消费
- 深化管理、提升IT的数据平台建设方案
- 天线学习笔记——HFSS简单阵列天线
- 期货反跟单-镜像零滑点软件真有那么靠谱吗?
- 暗影精灵3 PLUS 安装黑苹果
- 车辆信息查询api,通过车系名称查询相关信息
- 解决matlab2019b中文乱码问题
- 参加了一场温州游资的婚礼,也太壕了
- lamp架构部署 httpd编译、mysql二进制、php编译 网页访问效果
- 阿里双十一购物节背后的技术问题
- 微信小程序音乐播放器系统app毕业设计
- 尤雨溪:TypeScript不会取代JavaScript
- pointer在html作用,详解pointer-events属性的使用