C++虚函数的实现原理(最通俗但并不想专业的解释)
这是比较专业术语解释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++虚函数的实现原理(最通俗但并不想专业的解释)相关推荐
- C++ 之虚函数的实现原理
c++的多态使用虚函数实现,通过"晚绑定",使程序在运行的时候,根据对象的类型去执行对应的虚函数. C++ 之虚函数的实现原理 带有虚函数的类,编译器会为其额外分配一个虚函数表,里 ...
- C++虚函数的实现原理
一. 虚函数介绍 C++中的虚函数主要是用来实现多态(面向对象的三大特性之一)的. 下面是一个实现多态的错误例子: // 基类 // class Base { public:Base() {print ...
- (转载)虚函数的工作原理
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理 虚函数的实现要求对象携带额 ...
- C++虚函数的工作原理
静态绑定与动态绑定 讨论静态绑定与动态绑定,首先需要理解的是绑定,何为绑定?函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定. 理解了绑定后再理解静态与动态. 静态绑定:指在程序 ...
- C++ 面向对象(二)多态 : 虚函数、多态原理、抽象类、虚函数表、继承与虚函数表
目录 多态 多态的概念 多态的构成条件 虚函数 虚函数的重写 协变(返回值不同) 析构函数的重写(函数名不同) final和override final override 重载, 重写, 重定义对比 ...
- c++远征之多态篇——虚函数及其实现原理
以下内容源于慕课网的学习整理,如有侵权,请告知删除. 1.多态的定义 简单理解,就是对于同一条命令,不同对象会做出不同的操作. 相同对象收到不同消息,或者不同对象收到相同消息时,产生不同的动作. 2. ...
- pure virtual method called 纯虚函数被调用原理分析
程序退出或者组件析构过程中常发生一类"pure virtual method called"导致的core,前几栈帧如下: 这里对该问题发生的原理做一个剖析并给出一个可复现该问题的 ...
- 一文搞懂C++虚函数的实现原理
虚函数的概念 虚函数是实现C++中面向对象的三大特性之一--多态的一种技术手段. 什么是多态呢? 在基类的成员函数前,使用virtual修饰得到的就是虚函数.在派生类中,对继承得到的虚函数,进行重写, ...
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理 虚函数的实现要求对象携带额 ...
最新文章
- Visual C#弹出窗口杀手
- react.js做小程序_如何使用React.js构建现代的聊天应用程序
- [转自scott]ASP.NET MVC框架 (第二部分): URL路径选择
- Ceph 存储集群7-故障排除
- mysql dba系统学习(16)mysql的mysqldump备份
- LeetCode——BFS
- CodeForces - 500A-New Year Transportation(模拟)
- 想加入IT行业为何建议你学Python,不要错过时机哦
- pat乙级相当于什么水平_曼彻斯特大学相当于国内什么水平的大学?
- hexframe软件(二进制查看文件)
- 异速联某客户端无法登陆
- 杭电OJ 1046(C++)
- 使用jQuery美化英雄联盟
- 谷歌工程师深度技术分析“为什么ios比android流畅
- Ezchip Tilera Tile-Mx100: Der 100-ARM-Netzwerkprozessor
- 大表哥有个项目,100W预算,让我顺手做了算了......
- 国产处理器再获重大突破,走出国门挑战Intel和AMD
- 查看oracle数据库(database)的版本命令
- 入职5G网络优化工程师,税后9k,周末双休,你也可以!—分享优橙小故事
- 平安金融卫士 互联网理财“安全第一”
热门文章
- linux mem cache,Linux内存:MemTotal、MemFree、MemAvailable三者区别
- h5 客服系统源码_Bos:做在线客服系统项目(附源码)
- 软件工程采取了哪些措施以保证最终能够交付给用户一个高质量、低成本的软件产品?
- css3--弹性布局
- bzoj1132:[POI2008]Tro
- 使用隐含参数testMappingSpeed排查GoldenGate抽取慢的步骤
- MFC中属性表单和向导对话框的使用
- Python学习笔记14(socket编程)
- 二位数组按某一个或多个字段值(升序/降序)排序
- IOS AppUI规格指南