虚函数静态绑定与动态绑定

虚函数静态绑定与动态绑定

  • 当类里面定义虚函数,在编译阶段,会创建一个虚函数表,通过虚函数表指针进行指向。虚函数表内分别存储了,&RTTI信息,偏移量(一般为0),定义的虚函数地址
  • 同一个类定义的不同对象的虚函数指针指向同一个虚函数表
  • 当派生类继承某一个定义虚函数的基类时,同时也会创建一个定义虚函数表的虚函数指针。当派生类重写了某个虚函数,那么虚函数表里面的函数地址会进行更新成自定义的函数地址。
cpp 复制代码
#include <iostream>

using namespace std;
class Base {
public:
    Base(int data) : ma_(data) {}
    virtual void show() { cout << "Base::show()" << endl; }
    void show(int) { cout << "Base::show(int)" << endl; }
protected:
    int ma_;
};

class Drived : public Base {
public: 
    Drived(int data):Base(data), mb_(data){}
    void show() { cout << "Drived::show()" << endl; }
private:
    int mb_;
};

int main()
{
    Drived d(10);
    Base* p = &d;
}

编译器发现,void show()为普通函数就进行静态绑定 ,要是为虚函数就进行动态绑定要是Base里面没有虚函数,那么*p就是Base就是识别为Base类型;要是Base里面有虚函数,那么就通过虚函数指针里面的&RTTI信息进行识别Drived

相关推荐
小龙报6 分钟前
《算法每日一题(1)--- 第31场蓝桥算法挑战赛》
c语言·开发语言·c++·git·算法·学习方法
llz_1127 分钟前
五子棋小游戏
开发语言·c++·算法
liulilittle9 分钟前
在 Android Shell 终端上直接运行 OPENPPP2 网关路由配置指南
android·linux·开发语言·网络·c++·编程语言·通信
lihongli00023 分钟前
ROS与Qt结合开发CAN控制界面(发布自定义的truck_send_can1消息)
开发语言·qt·ros
java1234_小锋32 分钟前
什么是Java三高架构?
java·开发语言·架构
如竟没有火炬42 分钟前
全排列——交换的思想
开发语言·数据结构·python·算法·leetcode·深度优先
嵌入式小李.man1 小时前
C++第十三篇:继承
开发语言·c++
Bryce李小白1 小时前
Kotlin Flow 的使用
android·开发语言·kotlin
jarreyer1 小时前
python离线包安装方法总结
开发语言·python
李辰洋2 小时前
go tools安装
开发语言·后端·golang