C++学习Day07之动态联编和静态联编

这篇具有很好参考价值的文章主要介绍了C++学习Day07之动态联编和静态联编。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、程序及输出

C++ 中的联编(Binding)分为动态联编(Dynamic Binding)和静态联编(Static Binding)两种方式。它们分别指的是在运行时和编译时确定函数或方法的调用方式的过程。

1.1 静态联编(Static Binding)

静态联编是指在编译时确定函数或方法的调用方式。在编译阶段,编译器根据调用函数或方法的类型和参数类型来确定要调用的具体函数或方法。静态联编是通过函数名和参数类型来进行匹配的。静态联编通常用于普通的函数调用和非虚函数的调用。

#include<iostream>
using namespace std;

class Animal
{
public:
	void speak()
	{
		cout << "动物在说话" << endl;
	}

	void eat(int a )
	{
		cout << "动物在吃饭" << endl;
	}
};

class Cat :public Animal
{
public:
	void speak()
	{
		cout << "小猫在说话" << endl;
	}

	void eat(int a)
	{
		cout << "小猫在吃饭" << endl;
	}
};
void doSpeak(Animal & animal) //Animal & animal = cat;
{
	//如果地址早就绑定好了,地址早绑定,属于静态联编
	//如果想调用小猫说话,这个时候函数的地址就不能早就绑定好,而是在运行阶段再去绑定函数地址,属于地址晚绑定,叫动态联编
	animal.speak(); 

}

void test01()
{
	Cat cat;
	doSpeak(cat);
}
int main(){
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

输出:
C++学习Day07之动态联编和静态联编,C++,c++,学习

1.2 动态联编(Dynamic Binding)

动态联编(Dynamic Binding): 动态联编是指在运行时确定函数或方法的调用方式。在运行时,根据对象的实际类型来确定要调用的函数或方法。动态联编通过虚函数实现,即在基类中将要动态联编的函数声明为虚函数,派生类中重写这个虚函数。在调用时,根据对象的实际类型来确定调用的函数。

#include<iostream>
using namespace std;

class Animal
{
public:
	//虚函数
	virtual void speak()
	{
		cout << "动物在说话" << endl;
	}

	virtual void eat(int a )
	{
		cout << "动物在吃饭" << endl;
	}
};

class Cat :public Animal
{
public:
	void speak()
	{
		cout << "小猫在说话" << endl;
	}

	void eat(int a)
	{
		cout << "小猫在吃饭" << endl;
	}
};
//动态多态产生条件:
//先有继承关系
//父类中有虚函数,子类重写父类中的虚函数
//父类的指针或引用  指向子类的对象

//对于有父子关系的两个类  指针或者引用 是可以直接转换的
void doSpeak(Animal & animal) //Animal & animal = cat;
{
	//如果地址早就绑定好了,地址早绑定,属于静态联编
	//如果想调用小猫说话,这个时候函数的地址就不能早就绑定好,而是在运行阶段再去绑定函数地址,属于地址晚绑定,叫动态联编
	animal.speak(); 

}

void test01()
{
	Cat cat;
	doSpeak(cat);
}
int main(){
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

输出:
C++学习Day07之动态联编和静态联编,C++,c++,学习


二、分析与总结

静态联编在编译时确定函数调用方式,效率高,但不适用于多态情况。
动态联编在运行时确定函数调用方式,适用于多态情况,通过虚函数实现。动态联编提供了更灵活的调用方式,但会带来一定的性能开销。
动态多态产生条件:
①先有继承关系
②父类中有虚函数,子类重写父类中的虚函数
③父类的指针或引用 指向子类的对象文章来源地址https://www.toymoban.com/news/detail-833457.html

到了这里,关于C++学习Day07之动态联编和静态联编的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法 DAY45 动态规划07 70. 爬楼梯 322. 零钱兑换 279. 完全平方数 139. 单词拆分 多重背包

    和377. 组合总和 Ⅳ (opens new window)基本就是一道题了。 本题代码不长,题目也很普通,但稍稍一进阶就可以考察完全背包 动态规划五部曲 1、确定dp[j]的含义 dp[j] 凑成 j 的最少硬币的个数 2、确定递推公式 比如想凑成3, 如果手里有1,那么最小个数就是dp[2]+1 如果手里有2,那

    2024年02月02日
    浏览(61)
  • java算法day45 | 动态规划part07 ● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数

    题目描述: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 = m n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 输入描述:输入共一行,包含两个正整数,分别表示n, m 输出描述:输出一个整数,表示爬到楼顶的方法数

    2024年04月14日
    浏览(57)
  • 算法打卡day39|动态规划篇07| Leetcode 70. 爬楼梯(进阶版)、322. 零钱兑换、279.完全平方数

    Leetcode 70. 爬楼梯(进阶版) 题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 = m n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 输入描述:输入共一行,包含两个正整数,分别表示n, m 输出描述:输出一个整数,

    2024年04月14日
    浏览(65)
  • JavaSE学习进阶day07_02 异常

    异常,就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: 异常 : 指的是程序在执行过程中,出现的非正常的情况,最终会导致 JVM 的非正常停止 。 在Java等面向对象的编程语言中, 异常

    2023年04月24日
    浏览(40)
  • Day18:信息打点-小程序应用&解包反编译&动态调试&抓包&静态分析&源码架构

    目录 小程序获取-各大平台搜索 小程序体验-凡科建站模版测试上线 小程序抓包-ProxifierBurpSuite联动 小程序逆向-解包反编译动态调试架构 思维导图 章节知识点 Web:语言 / CMS / 中间件 / 数据库 / 系统 / WAF 等 系统:操作系统 / 端口服务 / 网络环境 / 防火墙等 应用: APP

    2024年04月09日
    浏览(42)
  • C/C++进程超详细详解【中部分】(系统性学习day07)

    目录 前言 一、守护进程 1.概念 2.守护进程创建的原理(如图清晰可见)  3.守护进程的实现(代码块) 二、dup和dup2 1,复制文件描述符 2.文件描述符重定向 三、系统日志 1,打开日志 2,向日志中写消息 3,关闭日志 四,文件锁 1.概念 2,给整个文件上锁 实例代码如下: 

    2024年02月08日
    浏览(48)
  • C++编译与运行:其一、静态类型和动态类型

    先说结论:编译期间可以明确的类型是静态类型;运行期间才能明确的类型是动态类型。 后半句可能有点不好理解,通俗地说,需要通过执行代码才能明确的类型是动态类型。 假如我们有两个类,分别是基类A,和派生类B。 第一行,编译的时候编译器就知道了,a的类型是

    2024年02月08日
    浏览(41)
  • 【C++】虚函数表 & 多态的原理 & 动态绑定和静态绑定

    梳理虚函数表、多态原理、动静态绑定的知识 目录 一、虚函数表 二、多态的原理 三、动态绑定和静态绑定 在学习多态原理之前,我们需要了解一下虚函数表的概念  我们先一起来看下下面这段代码 通过测试我们发现b对象是8bytes, 除了_b成员,还多一个__vfptr指针放在对象

    2024年02月03日
    浏览(42)
  • day42:C++ day2,C++对C的补充(引用、动态内存分配与回收、函数扩充以及结构体扩充)

    面试题小结: 1、指针与引用的区别? (1)指针指向的是变量的地址,而引用是指向变量本身; (2)指针可以有多级指针,而引用只有一级引用; (3)指针可以不初始化,但是引用必须初始化; (4)指针可以改变指向,但是引用初始化后就不能更改对象; (5)指针用

    2024年02月09日
    浏览(44)
  • Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习

    gcc -S test.i -o test.s//-S 的作用是编译结束生成汇编文件。 汇编阶段 汇编阶段把 .S 文件翻译成二进制机器指令文件 .o ,这个阶段接收.c ,.i ,.s 的文件都没有问题。 下面我们通过以下命令生成二进制机器指令文件 .o 文件: gcc -c test.s -o test.o 链接阶段 链接阶段,链接的是函数库。

    2024年04月09日
    浏览(104)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包