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

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

  • 当类里面定义虚函数,在编译阶段,会创建一个虚函数表,通过虚函数表指针进行指向。虚函数表内分别存储了,&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

相关推荐
坊钰2 分钟前
Java 反射机制
java·开发语言
单片机学习之路6 分钟前
【Python】输入print函数
开发语言·前端·python
李昊哲小课12 分钟前
Python办公自动化教程 - 第1章 openpyxl基础入门 - 第一次用代码操控Excel
开发语言·python·excel·openpyxl
小旭952712 分钟前
Spring Data Redis 从入门到实战:简化 Redis 操作全解析
java·开发语言·spring boot·redis·spring
zzginfo14 分钟前
javascript 类定义常见注意事项
开发语言·前端·javascript
SomeB1oody14 分钟前
【Python深度学习】1.1. 多层感知器MLP(人工神经网络)介绍
开发语言·人工智能·python·深度学习·机器学习
天下无贼!15 分钟前
【功能实现】基于Vue3+TS实现大文件分片上传
开发语言·javascript·node.js·vue·html5
程序员小寒20 分钟前
JavaScript设计模式(九):工厂模式实现与应用
开发语言·前端·javascript·设计模式
派大星酷22 分钟前
线程池-----Executors
java·开发语言
小碗羊肉32 分钟前
【从零开始学Java | 第二十八篇】可变参数
java·开发语言