这是比较专业术语解释C++虚函数的作用文章:https://blog.csdn.net/iFuMI/article/details/51088091 ,基础比较好的可以看这篇

接下来是我个人的理解,因为可能面试也需要,特此记录一下。

众所周知,虚函数是用来实现c++类的多态性的,先拿个示例代码给大家看,大家应该都能看懂,看完再解释

#include<iostream>
using namespace std;  class A
{
public:  void foo()  {  printf("1\n");  }  virtual void fun()  {  printf("2\n");  }
};
class B : public A
{
public:  void foo()  //隐藏:派生类的函数屏蔽了与其同名的基类函数{  printf("3\n");  }  void fun()  //多态、覆盖{  printf("4\n");  }
};
int main(void)
{  A a;  B b;  A *p = &a;  p->foo();  //输出1p->fun();  //输出2p = &b;  p->foo();  //取决于指针类型,输出1p->fun();  //取决于对象类型,输出4,体现了多态return 0;
} 

这个来自:https://blog.csdn.net/i_chaoren/article/details/77281785  自己打代码太麻烦了

简单介绍一下,就是B类继承了A的fun函数,并重写了,所以调用B.fun的时候,其实就是重写了A的fun函数,实现了多态。

以上的讲解大家都懂了之后,接下来讲解的是原理:

先把专业解释的版本给大家看:

后面是我个人的理解:

其实很简单的来说,就是每个类对象其实本身都包含了指向该函数地址的指针,然后虚函数比较厉害的是,它本身包含了一个虚函数表,其实就是听起来很高端,其实就是记录了函数地址的表格,更容易理解的就是类似于把地址写在txt文档当中,执行程序本质上,就是从执行函数入口地址,找到地址,执行就ok。(这个才是多态的灵魂本质)

然后多态就是,假如子类没有实现父类的虚函数,父类就把自己本身的地址给他用,所以就不会多态,如果子类很争气,自己实现了,那父类就觉得没必要再把地址给他了,也就自己实现了多态了。

希望对大家有帮助!

C++虚函数的实现原理(最通俗但并不想专业的解释)相关推荐

  1. C++ 之虚函数的实现原理

    c++的多态使用虚函数实现,通过"晚绑定",使程序在运行的时候,根据对象的类型去执行对应的虚函数. C++ 之虚函数的实现原理 带有虚函数的类,编译器会为其额外分配一个虚函数表,里 ...

  2. C++虚函数的实现原理

    一. 虚函数介绍 C++中的虚函数主要是用来实现多态(面向对象的三大特性之一)的. 下面是一个实现多态的错误例子: // 基类 // class Base { public:Base() {print ...

  3. (转载)虚函数的工作原理

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理       虚函数的实现要求对象携带额 ...

  4. C++虚函数的工作原理

    静态绑定与动态绑定 讨论静态绑定与动态绑定,首先需要理解的是绑定,何为绑定?函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定. 理解了绑定后再理解静态与动态. 静态绑定:指在程序 ...

  5. C++ 面向对象(二)多态 : 虚函数、多态原理、抽象类、虚函数表、继承与虚函数表

    目录 多态 多态的概念 多态的构成条件 虚函数 虚函数的重写 协变(返回值不同) 析构函数的重写(函数名不同) final和override final override 重载, 重写, 重定义对比 ...

  6. c++远征之多态篇——虚函数及其实现原理

    以下内容源于慕课网的学习整理,如有侵权,请告知删除. 1.多态的定义 简单理解,就是对于同一条命令,不同对象会做出不同的操作. 相同对象收到不同消息,或者不同对象收到相同消息时,产生不同的动作. 2. ...

  7. pure virtual method called 纯虚函数被调用原理分析

    程序退出或者组件析构过程中常发生一类"pure virtual method called"导致的core,前几栈帧如下: 这里对该问题发生的原理做一个剖析并给出一个可复现该问题的 ...

  8. 一文搞懂C++虚函数的实现原理

    虚函数的概念 虚函数是实现C++中面向对象的三大特性之一--多态的一种技术手段. 什么是多态呢? 在基类的成员函数前,使用virtual修饰得到的就是虚函数.在派生类中,对继承得到的虚函数,进行重写, ...

  9. C++中虚函数工作原理和(虚)继承类的内存占用大小计算

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理       虚函数的实现要求对象携带额 ...

最新文章

  1. Visual C#弹出窗口杀手
  2. react.js做小程序_如何使用React.js构建现代的聊天应用程序
  3. [转自scott]ASP.NET MVC框架 (第二部分): URL路径选择
  4. Ceph 存储集群7-故障排除
  5. mysql dba系统学习(16)mysql的mysqldump备份
  6. LeetCode——BFS
  7. CodeForces - 500A-New Year Transportation(模拟)
  8. 想加入IT行业为何建议你学Python,不要错过时机哦
  9. pat乙级相当于什么水平_曼彻斯特大学相当于国内什么水平的大学?
  10. hexframe软件(二进制查看文件)
  11. 异速联某客户端无法登陆
  12. 杭电OJ 1046(C++)
  13. 使用jQuery美化英雄联盟
  14. 谷歌工程师深度技术分析“为什么ios比android流畅
  15. Ezchip Tilera Tile-Mx100: Der 100-ARM-Netzwerkprozessor
  16. 大表哥有个项目,100W预算,让我顺手做了算了......
  17. 国产处理器再获重大突破,走出国门挑战Intel和AMD
  18. 查看oracle数据库(database)的版本命令
  19. 入职5G网络优化工程师,税后9k,周末双休,你也可以!—分享优橙小故事
  20. 平安金融卫士 互联网理财“安全第一”

热门文章

  1. linux mem cache,Linux内存:MemTotal、MemFree、MemAvailable三者区别
  2. h5 客服系统源码_Bos:做在线客服系统项目(附源码)
  3. 软件工程采取了哪些措施以保证最终能够交付给用户一个高质量、低成本的软件产品?
  4. css3--弹性布局
  5. bzoj1132:[POI2008]Tro
  6. 使用隐含参数testMappingSpeed排查GoldenGate抽取慢的步骤
  7. MFC中属性表单和向导对话框的使用
  8. Python学习笔记14(socket编程)
  9. 二位数组按某一个或多个字段值(升序/降序)排序
  10. IOS AppUI规格指南