virtual和override

偶然间看到的题,借此记录。

 class Program{static void Main(string[] args){D d = new D();  //第一个D是申明类,第二个D是实例类A a = d;B b = d;C c = d;a.F();b.F();c.F();d.F();}class A{public virtual void F() { Console.WriteLine("A.F"); }}class B : A{public override void F() { Console.WriteLine("B.F"); }}class C : B{public virtual void F() { Console.WriteLine("C.F"); }}class D : C{public override void F() { Console.WriteLine("D.F"); }}}

输出结果:

下面记录一下解题步骤:

a.F();  >>>  1. 检查申明类A 2. 是虚方法 3. 继续检查实例类D 4. 有重写,但是相对于类A来说Fun()在类C中被new 过,根据口诀“new则看类型,override只管新” 5. 继续检查父类B 6. 类B中override了父类A的 Fun() 7. 执行类B中的Fun(),输出B.F

b.F();  >>>  1. 检查申明类B 2. 不是虚方法 3. 直接执行类B中的Fun(),输出B.F

c.F();  >>>  1. 检查申明类C 2. 是虚方法 3. 继续检查实例类D 4. 有重写,类D重写了类C中的Fun(),根据口诀“new则看类型,override只管新” 5. 执行类D中的Fun(),输出D.F

d.F();  >>>  1. 检查申明类D 2. 不是虚方法 3. 直接执行类D中的Fun(),输出D.F

摘用一下别人特别好的总结:

具体的检查的流程如下

1、当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数;

2、如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。

3、在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果是有,那么OK,它就不会再找了,而马上执行该实例类中的这个重新实现的函数。而如果没有的话,系统就会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。

 在上面的规则中,可以看到,如果子类没有override的修饰,那么就算父类是virtual的方法,子类的方法也无法被调用,而会去它的父类中找override的方法,直到找到祖先类。所以在面向对象的开发过程中,如果要实现Dependency Injection、IoC等设计模式,就必须非常留意类设计中继承方法的声明,否则很可能导致实际的程序运行与预期不符。

 引用:https://www.cnblogs.com/yanyao/p/4830768.html

转载于:https://www.cnblogs.com/ZCrystal/p/11008409.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里内部资料!如何试出一个Android开发者真正的水平?系列教学

前言 马爸爸总结了一句话:跳槽,要么是钱不到位,要么是受了委屈。 我给自己这次的跳槽经历做了一个分析,希望能对那些想换工作的朋友有所帮助。 许多朋友想换工作,但是对“换工作”的理解可能仅限于写简历、投简历、…

CentOS7 linux下yum安装redis以及使用

CentOS7 linux下yum安装redis以及使用 1.安装redis数据库 1 yum install redis 2.下载fedora的epel仓库 yum install epel-release 3.启动redis服务 systemctl start redis 4.查看redis状态 systemctl status redis systemctl stop redis 停止服务 systemctl restart r…

Codeforces 1182A Filling Shapes

题目链接&#xff1a;http://codeforces.com/problemset/problem/1182/A 思路&#xff1a;n为奇数时不可能完全填充&#xff0c;ans 0。发现若要完全填充&#xff0c;每俩列可产生俩种情况&#xff0c;所以为 ans 2n/2 AC代码&#xff1a; 1 #include<bits/stdc.h>2 us…

阿里大神最佳总结Flutter进阶学习笔记,技术详细介绍

开头 很多人工作了十年&#xff0c;但只是用一年的工作经验做了十年而已。 高级工程师一直是市场所需要的&#xff0c;然而很多初级工程师在进阶高级工程师的过程中一直是一个瓶颈。 移动研发在最近两年可以说越来越趋于稳定&#xff0c;因为越来越多人开始学习Android开发&…

掌握这些Android开发热门前沿知识,跳槽薪资翻倍

前言 这是一篇软文、但是绝对不是鸡汤&#xff1b;为啥不是呢&#xff1f;因为我文笔太差…偶尔矫情发发牢骚&#xff08;勿喷&#xff09; 说说程序猿行业 现在社会上给IT行业贴上了几个标签&#xff1a;高薪、高危、高大上、秃顶&#xff08;哈哈&#xff09;。这些标签我…

linux环境-docker安装rabbitmq

1、进入docker hub镜像仓库地址&#xff1a;https://hub.docker.com/ 2、搜索rabbitMq&#xff0c;进入官方的镜像&#xff0c;可以看到以下几种类型的镜像&#xff1b;我们选择带有“mangement”的版本&#xff08;包含web管理页面&#xff09;&#xff1b; 3、拉取镜像 doc…

揭秘ARouter路由机制,源码+原理+手写框架

前言 每个程序员都有一个梦想&#xff0c;那就是进一线互联网公司深造&#xff0c;不要跟我说你不想进去&#xff0c;如果给你一个这样的平台&#xff0c;不管是薪资待遇还是接触的高度来说&#xff0c;对我们程序员来说都是一个机会&#xff0c;我以前有一个同事&#xff0c;…

揭秘!双非渣本Android四年磨一剑,学习路线+知识点梳理

第一次观看我文章的朋友&#xff0c;可以关注、点赞、转发一下&#xff0c;每天分享各种干货技术和程序猿趣事 由于涉及到的面试题较多导致篇幅较长&#xff0c;我根据这些面试题所涉及到的常问范围总结了并做出了一份学习进阶路线图​​​​​​​及面试题答案免费分享给大家&…

Windows上PostgreSQL安装配置教程

这篇文章主要为大家详细介绍了Windows上PostgreSQL安装配置教程&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 PostgreSQL的扩展PostGIS是最著名的开源GIS数据库。 安装PostgreSQL是第一步。 1.下载PostgreSQL的二进制安装文件。 PostgreSQL官网…

快递100接口的调用过程

前言 大部分的商城都需要调用快递的接口来记录商城的物流信息&#xff0c;这里就给出一种快递接口&#xff08;快递100&#xff09;调用的方法。 正文 一、官方文档 1. 官方文档的地址为&#xff1a; https://www.kuaidi100.com/openapi/api_subscribe.shtml 二、具体实现 1. 商…

搞懂开源框架设计思想真的这么重要吗?终获offer

正文 从我个人的角度写写30多岁码工的感受&#xff1a;的确是受年龄压力开始增大了。比如二十多岁的小年轻&#xff0c;可能什么都懂&#xff0c;对组里的东西很熟悉。有时候我也怀疑自己是不是智商不够&#xff0c;是不是自学能力太差&#xff0c;是不是基础不行&#xff0c;…

真香定律!Android动态换肤实现原理解析,吐血整理

自己项目中一直都是用的开源的xUtils框架&#xff0c;包括BitmapUtils、DbUtils、ViewUtils和HttpUtils四大模块&#xff0c;这四大模块都是项目中比较常用的。最近决定研究一下xUtils的源码&#xff0c;用了这么久总得知道它的实现原理吧。我是先从先从BitmapUtils模块开始的。…

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案

knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! knife4j的前身是swagger-bootstrap-ui&#xff0c;为了契合微服务的架构发展,由于原来swagger-bootstrap-ui采…

真香定律!一文带你搞懂Android多线程Handler,成功入职腾讯

Google 为了帮助 Android 开发者更快更好地开发 App&#xff0c;推出了一系列组件&#xff0c;这些组件被打包成了一个整体&#xff0c;称作 Android Jetpack&#xff0c;它包含的组件如下图所示&#xff1a; 老的 support 包被整合进了 Jetpack&#xff0c;例如上图 Foundatio…

真香警告!2021Android高级面试题,挥泪整理面经

前言 这是“拔剑金九银十”的第二篇文章&#xff0c;本文主要针对3年以上的Android开发者进阶面试中高级开发工程师而整理。 希望可以对你们有所帮助。不多废话&#xff0c;进入正题。 目录&#xff1a; Java中高级 计算机网络 Android高级面试—性能优化 Android优秀第三方…

冗余的阿里云实例开启和停止API

停止使用的API URL:https://api.aliyun.com/?spm5176.12818093.resource-links.dapi_platform.488716d0OrHCwQ#/?productEcs&version2014-05-26&apiStopInstance&tabDEMO&langJAVA 启动实例&#xff1a; URL:https://api.aliyun.com/?spm5176.12818093.re…

知乎大V推荐!面试官6个灵魂拷问,原理+实战+视频+源码

概述 想了很久怎么样可以让文章的标题不那么悲观&#xff0c;但是各种文案都在我脑海里面不断的被否定&#xff0c;要么是不那么抓眼球&#xff0c;要么是立意不匹配。最后想了想&#xff0c;这个标题是真的符合我最近的感悟。 希望看过文章&#xff0c;能有同感的朋友也能多…

Windows10家庭版安装Docker Desktop(非Docker Toolbox)

现在大部分笔记本预装的都是win10家庭版&#xff0c;而家庭版又不支持Hyper-V&#xff0c;Docker Desktop是无法直接安装的。但其实家庭版是可以通过脚本开启Hyper-V来安装Docker Desktop的。下面就教大家如何操作。 开启Hyper-V 添加方法非常简单&#xff0c;把以下内容保存…

阿里P7手把手教你!阿里P7级别面试经验总结,搞懂这些直接来阿里入职

什么是中年危机 根据权威数据显示&#xff0c;国内IT程序员鼎盛时期是在25-27岁左右&#xff0c;30岁对于程序员而言完全是一个38线&#xff0c;接着就是转业转岗的事情&#xff0c;这一点在业界也算是一个共识了。 大学毕业步入IT行业普遍年龄也是在22岁左右&#xff0c;然而…

自适应阈值化操作:adaptiveThreshold()函数

在图像阈值化操作中&#xff0c;更关注的是从二值化图像中&#xff0c;分离目标区域和背景区域&#xff0c;但是仅仅通过设定固定阈值很难达到理想的分割效果。而自适应阈值&#xff0c;则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处&#xf…