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

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

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

相关推荐
清水白石00833 分钟前
从菱形继承到 `super()`:彻底理解 Python MRO 与多继承方法查找机制
开发语言·python
Naiva39 分钟前
【数学+MATLAB实验室】第一阶段_函数和图像(一次、二次、指数、对数、正弦、余弦、平移、缩放、叠加)
开发语言·matlab
hai3152475431 小时前
FlashAttention C语言(C++)实现(展示版)
c语言·开发语言·c++·人工智能·算法
wuminyu2 小时前
Java锁机制之Java对象重量级锁源码剖析
java·linux·c语言·jvm·c++
dongf20192 小时前
R语言KKNN算法
开发语言·数据分析·r语言
辣椒思密达2 小时前
Python HTTP请求中的重试与超时控制:提升稳定性的实用方法
开发语言·python·http
加号32 小时前
【C#】 Web API 自定义配置函数请求路径:从路由本质到灵活架构设计
开发语言·c#
郝学胜_神的一滴2 小时前
Qt 高级开发 026:QTabWidget御道,从筑基到化境
c++·qt
KANGBboy2 小时前
java知识四(面向对象编程)
android·java·开发语言
雪的季节2 小时前
矢量数据提取分析(甲方平台)
开发语言