首页 > 其他分享 >虚函数 静态绑定 动态绑定

虚函数 静态绑定 动态绑定

时间:2022-08-30 21:24:15浏览次数:76  
标签:函数 show 静态 绑定 int Base public

虚函数详解: https://blog.csdn.net/lyztyycode/article/details/81326699

虚函数作用主要是实现了多态机制多态就是用父类类别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可与让父类的指针有"多种形态"。(这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。)

   

C++虚函数&静态绑定和动态绑定-vfptr虚函数指针-vftable虚函数表

https://www.bilibili.com/video/BV1MP4y1Y7qQ?spm_id_from=333.851.header_right.history_list.click

   

判断是不是动态绑定,就看定义为父类的指针 指的函数是不是虚函数,并且改指针指向子类 的函数是否重写(覆盖)

   

一个类定义了虚函数,对类有什么影响

总结一:如果类里面定义了虚函数,那么编译器需给这个类型产生一个唯一的vftable虚函数表,虚函数表中主要存储的内容就是RTTI(运行时的类型信息)指针虚函数的地址。当程序运行时,每一张虚函数表都会加载到内存的.rodata区(只读不能写)

   

总结二:一个类里面定义了虚函数,那么这个类定义的对象,在其运行时,内存中开始部分,多存储一个vfptr虚函数指针,指向相应类型的虚函数表vftable。一个类型定义的n个对象,他们的vfptr指向的都是同一个虚函数表

   

总结三:一个类里面虚函数的个数,不影响对象内存大小(vfptr),影响的是虚函数表的大小

   

总结四:如果派生类中的方法,和基类继承来的某个方法,函数名,参数列表,返回值都相同,而且基类的方法是vritual虚函数,那么派生类的这个方法自动处理为虚函数。(覆盖的关系)

静态绑定:

   

#include <iostream>

using namespace std;

   

class Base {

public:

int ma;

public:

Base(int data = 10) : ma (data) {}

//非虚函数

void show() {

cout << "Base::show()" << endl;

}

//非虚函数

void show(int data) {

cout << "Base::show(int)" << data << endl;

}

};

   

class Son : public Base {

public:

int mb;

public:

Son(int data = 100) : mb(data) {}

void show() {

cout << "Son::show()" << endl;

}

};

   

int main() {

Son s = Son();

Base* p = &s;

   

p->show();        //Base::show()                静态绑定,编译期绑定,运行父类函数

p->show(1);        //Base::show(int)1        静态绑定,编译期绑定,运行父类函数

   

return 0;

}

动态绑定:

   

#include <iostream>

using namespace std;

   

class Base {

public:

int ma;

public:

Base(int data = 10) : ma (data) {}

//虚函数

virtual void show() {

cout << "Base::show()" << endl;

}

//虚函数

virtual void show(int data) {

cout << "Base::show(int)" << data << endl;

}

};

   

class Son : public Base {

public:

int mb;

public:

Son(int data = 100) : mb(data) {}

//对父类函数进行了重写

//虚函数表放的是不是父类函数的地址,而是重写后的函数地址

void show() {

cout << "Son::show()" << endl;

}

};

   

int main() {

Son s = Son();

Base* p = &s;

   

//Base::show() 是一个虚函数 而且子类进行了重写 进行动态绑定

p->show();        //Son::show()                动态绑定,运行时期的绑定,运行子类函数

p->show(1);        //Base::show(int)1        静态绑定,编译期的绑定,运行父类函数

   

return 0;

}

重写(覆盖):

虚函数表中虚函数地址的覆盖

   

父类base 虚函数表

   

子类 虚函数表:

重写(覆盖):虚函数表中虚函数地址的覆盖

标签:函数,show,静态,绑定,int,Base,public
From: https://www.cnblogs.com/libxing/p/16640836.html

相关文章

  • 实验二 控制结构和函数
    打印温度柱状图#include<iostream>#include<iomanip>#include<cmath>usingnamespacestd;//输入n个温度voidinputTemps(inttemp[],intn);//显示月间温度的......
  • awk时间函数
    awk时间函数_jalele的博客-CSDN博客_awk生成时间 https://blog.csdn.net/chenglian1987/article/details/52525391awk提供了两个函数来获取时间和格式化时间戳:systime......
  • 关于 JavaScript 函数的思考
    函数可以将一堆重复的代码整合成一个整体,在需要改变的地方通过参数传值来改变。比如,根据类型查询数据,接口返回的数据一样,后续处理这个数据的逻辑也是一样的,只有类型和输入......
  • Python中函数或者类对象带()与不带()的区别——闭包和函数返回时的常见现象
    Python中函数或者类对象带()与不带()的区别-----闭包和函数返回时的常见现象-函数不带括号时,调用的是这个函数本身,是整个函数体,是一个函数对象,不需等该函数执行完成,返回一个......
  • 高斯超几何函数如何运作(数学)
    高斯超几何函数如何运作(数学)Photoby乔什·皮福德on不飞溅计算合流和高斯超几何函数的数值方法(arXiv)作者:约翰·W·皮尔逊,希恩·奥尔弗,梅森·波特抽......
  • seurat单细胞数据分析实现 DimHeatmap函数
     上游分析:https://www.jianshu.com/p/4f7aeae81ef1001、cell<-pbmc[["pca"]]@cell.embeddingscell<-cell[order(cell[,1],decreasing=T),]cell<-rownames(......
  • 作用域与立即执行函数
    应用场景:改变变量作用域;上述代码就是改变变量作用域,一个很好的例子。封装临时变量;加载只需要执行一次的代码,比如显示时间。这些代码也需要一些临时的变......
  • R语言中seq函数
     001、seq(10)seq(2,10,2)##设置起始位置,步长  002、seq(2,10,length=2)##设置返回值的个数seq(2,10,le......
  • 函数
    4、函数1.什么是函数?具备某一功能的函数,事先准备好一个工具2,为何要使用函数?1>.不适应函数组织结构不清晰,可读性差2>.代码冗余,不好维护3>.如何使用函数原则:先定义后......
  • C调用C++函数
    2.C中调用C++函数`extern"C"`在C中是语法错误,需要放在C++头文件中。```c//add.h#ifndefADD_H#defineADD_Hextern"C"{  intadd(intx,inty);}#e......