普通成员函数的调用方式是直接通过编译期间确定的函数地址来调用。

多态是通过查询对象的虚函数表来获取虚函数的地址。因为像工厂模式这样,并不能在编译期间知道基类指向的是哪个子类,也就导致了不能在编译期间获取到函数的首地址,也就是不能实现动态绑定。

实际上动态绑定的实现原理是,在程序执行的时候,将子类的虚函数表地址赋值给基类对象的虚函数表指针,再通过查询虚函数表的方式获取最新的函数地址,从而完成了动态绑定。

拓展

上述说明的是动态多态。但是也有静态多态的说法,包括函数重载和函数模板,即:在编译期间通过形参类型推断出函数地址的方法。

(SAW:Game Over!)

Cpp 对象模型探索 / 多态的本质相关推荐

  1. Cpp 对象模型探索 / 单一继承的类的内存布局

    目录 1.父类和子类都没有虚函数 2.父类有虚函数.子类没有虚函数 3.父类没有虚函数,子类有虚函数 4.父类和子类都有虚函数 5.总结 #include <iostream> class ...

  2. Cpp 对象模型探索 / 含有虚基类的类的内存布局

    一.栗子 class Grand { public:int i_grand_ = 8; };class Parent1 : public virtual Grand { public:int i_pa ...

  3. Cpp 对象模型探索 / 系列文章的索引

    一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...

  4. Cpp 对象模型探索 / delete 运算符内部调用过程分析

    一.delete 调用过程 1.测试代码,在 delete 处打下断点. class CTest { public:CTest() {}~CTest() {} };int main() {CTest* ...

  5. Cpp 对象模型探索 / 静态联编和动态联编

    一.源码 #include <iostream>class Father { public:Father(){/*** 该处直接将该对象清零,意味着虚函数表指针亦被清零.*/memset( ...

  6. Cpp 对象模型探索 / 继承关系下的虚函数手动调用

    一.多态机理 #include <iostream>class Father { public:virtual void Func1(){std::cout << " ...

  7. Cpp 对象模型探索 / 不能被继承的类

    两种方法 C++ 11 final 关键字 友元类 + 虚继承. 栗子 class A { private:A() {}friend class B; }; class B : virtual pub ...

  8. Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序

    栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...

  9. Cpp 对象模型探索 / 外部调用私有的虚函数的方法

    答案 通过虚函数表指针找到虚函数表,再通过虚函数表中的元素,即:函数指针,得到私有函数的首地址. 示例 #include <iostream>class A { private:virtu ...

最新文章

  1. Codeforces Round #643 (Div. 2)B到C题解
  2. ​kdevelop用法_weixin_44594953的博客-CSDN博客_kdevelop​
  3. Mysql Mariadb 创建新用户
  4. NYOJ 201 作业题
  5. Codeforces 803E--Roma and Poker (DP)
  6. 通过python实现linux切换用户_Python操作远程服务器切换到root用户
  7. 前端学习(669):流程控制
  8. 你真的懂break和continue吗?这篇文章让你明白
  9. Eureka-zookeeper的服务发现替代方案
  10. python oj题目_Python OJ 从入门到入门基础练习 10 题
  11. python输出excel能够识别的utf-8格式csv文件
  12. STL--deque用法
  13. 【数据库课程设计】企业库存管理系统
  14. WORD文档转换成HTML
  15. 板绘新手入门sai绘画软件有哪些技巧?
  16. Unity网游开发生存指南—蒸汽之城
  17. Python Requests爬取百思不得姐视频
  18. 拿它们练Python爬虫,是在法律边缘试探吗?爬虫圈香饽饽之视频网站的评论区采集
  19. 第二次软件综合实验专题作业——结对编程 1759103 李思佳 、 1759107 陶彦婷
  20. 小米平板4 android版本,小米平板4/4Plus通刷-LOS-安卓9.0.0-稳定版Stable2.0-来去电归属-农历等-本地化增强适配...

热门文章

  1. maven The method must override a superclass method
  2. 安徽省公务员计算机专业知识,安徽省公务员考试计算机专业知识编程题
  3. 2020年_Jsp Jstl 学习笔记
  4. SpringSecurity - 基础篇
  5. 详解mybatis的配置setMapperLocations多个路径两种方法
  6. reactjs DOM的Diffing算法
  7. Goland设置Go相关环境
  8. 【收藏】CentOS 7 安装NFS
  9. linux挂载分区至目录
  10. hbase集群重启后异常删除zookeeper中的元数据