zoukankan      html  css  js  c++  java
  • 虚函数

    首先通过虚函数实现晚捆绑,这里面所有的工作是编译器完成的,编译器安装必要的晚捆绑机制。

    关键字virtual告诉编译器不应当现在早捆绑,而是安装一个晚捆绑必须的所有机制。

    通用的实现方法是,编译器为每个虚函数的类创建一个表,在这个表,编译器放置特定类的虚函数的地址。在每个带有虚函数的类中,编译器秘密地放置一个指针,成为vpointer,指向这个对象的虚函数表。

    当通过基类指针做函数调用时(多态调用时),编译器静态的插入能取得这个vpointer并在虚函数表找到函数地址的代码。这样就可以实现晚捆绑了。

     如上图所示,没有任何虚函数的类是成员变量的数据大小,有一个和多个虚函数的大小都增加了一个void*的大小。

     这是因为编译器发现有一个或者多个虚函数时,编译器就会在插入单个指针,这个指针指向的是这个类在虚函数表的起始地址。

    虚函数表的建立过程:

       每当创建一个包含虚函数的类或包含虚函数的类派生的一个类时,编译器就会为这个类创建一个唯一的VTABLE(虚函数表),在这个表中,编译器放置了这个类中或者它的基类中所有的声明为virtual的函数的地址

       相当于基类和自己类的虚函数都会放在里面,如果派生类没有重写基类的虚函数就会使用基类的地址。

  • 相关阅读:
    anoconda 安装jieba库
    数据挖掘算法
    统计学方法论
    PowerBI 的简单介绍
    Numpy的补充(重要!!)
    Mysql语法顺序和执行顺序
    快速激活Navicat Premium 12
    day4-Mysql数据库基础操作
    day3-Mysql多实例配置
    day2-Mysql5.6.36编译安装
  • 原文地址:https://www.cnblogs.com/lingqingyu/p/13263191.html
Copyright © 2011-2022 走看看