首页 > 其他分享 >49. 静态联编动态联编及多态原理

49. 静态联编动态联编及多态原理

时间:2024-09-02 15:26:28浏览次数:5  
标签:函数 49 联编 void 多态 int animal


  • 静态联编动态联编
  • 静态多态(就是函数重载)和动态多态
  • 静态多态:函数重载,运算符重载
  • 动态多态:
  • //先有继承关系
  • //父类中有虚函数,子类重写父类中的虚函数
  • //父类的指针或引用 指向子类的对象
  • 静态多态在编译阶段绑定地址,地址早绑定,静态联编
  • 动态多次在运行阶段绑定地址,地址晚绑定,动态联编
  • 多态原理
  • 当父类写了虚函数后,类内部结构发生改变,多了一个vfptr
  • vfptr 虚函数表指针 ---- > vftable 虚函数表
  • 虚函数表内部记录着 虚函数的入口地址
  • 当父类指针或引用指向子类对象,发生多态,调用是时候从虚函数中找函数入口地址
  • 虚函数 关键字 virtual
  • 利用指针的偏移调用 函数
  • ((void()()) ((int )(int *)animal)) ();
  • typedef void( __stdcall *FUNPOINT)(int);
  • (FUNPOINT (((int)(int)animal + 1)))(10);

49. 静态联编动态联编及多态原理_虚函数

#define _CRT_SECURE_NO_WARNINGS
#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;
	}
};

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


//动态多态产生条件:
//先有继承关系
//父类中有虚函数,子类重写父类中的虚函数
//父类的指针或引用  指向子类的对象

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

}

void test01()
{
	Cat cat;
	doSpeak(cat);

	Dog dog;
	doSpeak(dog);
}




void test02()
{
	//cout << "sizeof  Animal = " << sizeof (Animal) << endl;

	Animal * animal = new Cat;
	//animal->speak();
	// *(int *)animal 解引用到虚函数表中
	// *(int *)*(int *)animal 解引用到函数speak地址

	//调用猫说话
	((void(*)()) (*(int *)*(int *)animal)) ();


	//C/C++默认调用惯例  __cdecl
	//用下列调用时候 真实调用惯例  是 __stdcall
	//调用猫吃饭
	typedef void( __stdcall *FUNPOINT)(int);

	(FUNPOINT (*((int*)*(int*)animal + 1)))(10);
}


int main(){
	//test01();
	test02();

	system("pause");
	return EXIT_SUCCESS;
}


标签:函数,49,联编,void,多态,int,animal
From: https://blog.51cto.com/zaishu/11898410

相关文章

  • 69. 异常的多态使用
    异常的多态使用提供基类异常类classBaseException纯虚函数virtualvoidprintError()=0;子类空指针异常和越界异常继承BaseException重写virtualvoidprintError()测试利用父类引用指向子类对象#define_CRT_SECURE_NO_WARNINGS#include<iostream>usingname......
  • 【华为OD机试真题E卷 Python语言】494、猜字谜 | 机试真题+思路参考+代码解析(E卷复用)
    文章目录一、题目......
  • 代码随想录day48 || 739, 每日温度 496, 下一个更大元素 I 503, 下一个更大元素II
    739每日温度funcdailyTemperatures(temperatures[]int)[]int{ //双指针 varres=make([]int,len(temperatures)) fori:=0;i<len(temperatures);i++{ forj:=i+1;j<len(temperatures);j++{ iftemperatures[j]>temperatures[i]{ res[i]=j......
  • jsp艾贝尔宠物医院预约平台u49qp
    jsp艾贝尔宠物医院预约平台u49qp本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能用户,宠物医生,宠物信息,在线预约,在线咨询,宠物病历技术要求:   开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技......
  • 题解:洛谷 P10497 [USACO03Open] Lost Cows
    原题链接思路+算法首先,考虑读入到\(a_i\)时,如果要得到此时的最优解(指所有牛的编号不重不漏地覆盖\([1,i]\)的所有编号),对于第\(i\)头奶牛,因为在它前面有\(a_i\)头奶牛的编号小于它,所以第\(i\)头奶牛的编号应当为\(a_i+1\)。如果有一头新的奶牛\(i+1\)加入到这个......
  • L1-049 天梯赛座位分配 分数 20
    模拟过程走一遍即可#include<bits/stdc++.h>usingnamespacestd;constintN=110;intM[N];#definexfirst#defineysecondintmain(){intn;cin>>n;intmaxm=0;for(inti=1;i<=n;++i){cin>>M[i];......
  • 20240831_174849 scratch 画笔模块入门必会
    20240904_015445scratch认识画笔模块画笔模块属于软件的内置模块使用前需要导入一下功能是可以实现绘画功能相关积木20240904_025445scratch绘制一条直线需求绘制一条直线实现20240904_035445scratch绘制一条粗直线需求实现20240904_045445scrat......
  • (大三上_游戏开发设计模式_上课_1)多态练习_计算机
    灵活性,可扩展,灵活性,可维护封装继承:要有基类代码片段写整个属性    基类里面 基态      基方向,虚方法//虚方法,可以写在实例方法里 publicvirtualdoubleGetResult() {  return0;}实例方法,可以创建实例抽象方法,要写在抽......
  • 11.多态
    11.多态(Polymorphism)11.1引言使用多态性,可以设计和实现易于扩展的系统,只要新类是程序通常处理的继承层次结构的一部分,就可以添加新类,而无需对程序的常规部分进行修改。程序中唯一必须更改以适应新类的部分是那些需要直接了解添加到层次结构中的新类的部分。例如,如果我们创建......
  • C++ 135类和对象_面像对像_多态
    135类和对象_面像对像_多态学习内容 1.抽象类 2.虚函数 3.纯虚函数动态多态满足条件1.有继承关系2.子类重写父类函数3.用父类的函数指针指向子类的对象AnimalBaseModel&animal代码#include<iostream>usingnamespacestd;//cout在这里,没有它会报错#includ......