希望这篇文章对理解C#的对象模型有所帮助
还是通过实例代码来解释吧
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
上面第一段代码的内存布局如下图所述:
第二段的代码相对简单,只是把用lBaseClass指向的对象强制类型转换为子类对象,内存结构如下图所示:
第三段的代码的内存结构如下图所示:
第四段的代码的内存结构如下图所示:
第五段的内存如下图所示:
总之,大家要知道,等编译完成后,所有的属性访问或者函数调用都已经根据变量的声明类型都被确定了(访问哪个内存地址已经确定了),除了虚函数(晚绑定)...。
比如调用lBase.VirtualName()这个虚函数,编译器做的工作流程如下:
1,为BaseClass和DerivedClass的各个虚函数编号1(偏移量)
2,lBase.VirtualName()表示调用lBase对象的vtable指针(在C++,Delphi中都是类似处理,根据对象的地址,获取该对象的vTable)所指向的vTable表中的1号虚函数。
3,那么如果lBase实际是指向BaseClass创建的对象,那么就会调用BaseClass的VirtualName(),如果lBase实际是指向DerivedClass创建的对象,那么就会调用DerivedClass的VirtualName()。则就是多态。
这里以一句侯捷的话作为本文的结束语:“勿在浮沙筑高台”。
转载于:https://www.cnblogs.com/caomao/archive/2005/06/16/175459.html
希望这篇文章对理解C#的对象模型有所帮助相关推荐
- 如果你也在学python,准备要学习python,希望这篇文章对你有用。
如果你也在学python,准备要学习python,希望这篇文章对你有用.虽然有点长,但是建议坚持看完! 首先 建议1.理解Pythonic概念--详见Python中的<Python之禅> ...
- 2.2基本算法之递归和自调用函数_你为什么学不会递归?读完这篇文章轻松理解递归算法...
对于很多编程初学者来说,递归算法是学习语言的最大障碍之一.很多人也是半懂不懂,结果学到很深的境地也会因为自己基础不好,导致发展太慢. 可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却 ...
- 可能存在无限递归_你为什么学不会递归?读完这篇文章轻松理解递归算法
对于很多编程初学者来说,递归算法是学习语言的最大障碍之一.很多人也是半懂不懂,结果学到很深的境地也会因为自己基础不好,导致发展太慢. 可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却 ...
- 彻底理解 SpringIOC、DI,这篇文章就够了
前言 你可能会有如下问题: 1.想看Spring源码,但是不知道应当如何入手去看,对整个Bean的流程没有概念,碰到相关问题也没有头绪如何下手 2.看过几遍源码,没办法彻底理解,没什么感觉,没过一阵子 ...
- 来篇文章:Martin Fowler的设计已死中文版
设计已死? 英文原文版权由Martin Fowler拥有 Original text is copyrighted by Martin Fowler Martin Fowler Chief Scien ...
- java中override快捷键_【基础回溯1】面试又被 Java 基础难住了?推荐你看看这篇文章。...
本文已经收录自 https://github.com/Snailclimb/JavaGuide (59k+ Star):[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. ...
- Java面试不通过?这篇文章你看了吗?
文章目录 一.Java 基础 1.JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么? 3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗 ...
- 准备开发一个智能硬件,得先看这篇文章!
一个智能硬件生命周期内所需要经历的全部流程,以及产品经理需负责的相关工作分为以下各阶段, 我们一起看看这个过程有多长,又有哪些经验可以分享. 一.市场分析 如同互联网产品一样,除了在立项之前需要对市场 ...
- Python 这篇文章告诉我Python实际中干什么事情
一直心存疑虑:Python可以干什么事情? 对Python在企业级开发中的10大误解 lyxi | 2015-10-15 10:49 浏览量(216) 评论(0) 推荐(0) 数据 在 ...
- 汽车保养知识知多少?这篇文章让你秒懂
随着科技水平的发展,汽车的拥有量越来越多,汽车保养的知识又有多少人懂呢?这篇文章简单介绍下. 燃油滤清器 正常我们所说的三滤一般指机油滤清器,空气滤清器,空调滤清器这三种.燃油滤清器属于长效滤清器,不 ...
最新文章
- shell脚本的命令行传参
- Could not load dynamic library ‘cudart64_101.dll‘
- 转发和重定向和request域对象
- django定时任务
- 栈的应用--迷宫问题
- Hadoop学习笔记—10.Shuffle过程那点事儿
- 【Linux】查看日志文件
- java 在面板中加入标签_创建一个JTabbedPane面板,为每一个标签设置一个名称
- 源码分析Dubbo服务提供者启动流程-下篇
- OMNeT++ ALOHA sample代码阅读
- Django入门:第十一章、基础模板
- 强智教务系统模拟登陆经验【附源码】
- llama是什么动物_羊驼(Alpaca)与骆马(Llama)
- 调查:听取当前用户的意见(并改进),是为什么?
- 先进级!阿里云大数据+AI平台通过信通院数据平台整体解决方案最高等级评测
- python程序员专用壁纸_神级python程序员分享的让小白30分钟快速上手的一张神图,赶快收藏!...
- android 相机自动延时拍照软件,延时摄影大师app下载-延时摄影大师 安卓版v3.0-PC6安卓网...
- cm-14.1 Android系统定制(二):内置系统应用
- STL 大锅炖(一):什么是 STL
- 即时配送行业黑马 闪飞侠2022正式起航
热门文章
- php array sum 小数位,多维数组上的PHP Array_Sum
- java获取鼠标点击的坐标_怎么我用Java窗外获取鼠标点击的坐标
- gin--简单的登录界面的实现
- JSEclipse安装后无法打开js文件_如何在你的 PC 上 下载并配置 Node.js
- redis smembersmap_Redis五种数据类型
- locate命令详解
- 与Claudia.js的作者Gojko Adzic谈论如何通过Claudia将Node.js微服务部署至AWS Lambda
- Fork/Join 框架-设计与实现(翻译自论文《A Java Fork/Join Framework》原作者 Doug Lea)...
- 读取和导出下载 excel 2003,2007 资料
- centos6.5 vncserver安装与配置