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.pswp.cn/news/386660.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386660.shtml
英文地址,請注明出處:http://en.pswp.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開發&…

Mysql 允許所有IP訪問

$ mysql -u root -p Enter password:mysql> use mysql#mysql> GRANT ALL ON *.* to root192.168.1.4 IDENTIFIED BY your-root-password; mysql> GRANT ALL ON *.* to root% IDENTIFIED BY root; mysql> FLUSH PRIVILEGES;

貪心算法小結2

F-Ants 一隊螞蟻在一根水平桿上行走&#xff0c;每只螞蟻固定速度 1cm/s. 當一只螞蟻走到桿的盡頭時&#xff0c;立即從稈上掉落. 當兩只螞蟻相遇時它們會掉頭向相反的方向前進. 我們知道每只螞蟻在桿上的初始位置, 但是, 我們不知道螞蟻向哪個方向前行. 你的任務是計算所有螞蟻…

掌握這些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;…

docker 安裝 nacos/nacos-server 鏡像并配置本地數據庫

docker pull nacos/nacos-server 啟動鏡像 這里啟動容器的時候參數配置我就不在詳解了&#xff0c;不明白的話&#xff0c;評論區留言&#xff0c;有不會的問題一定要及時詢問&#xff0c;期待你的評論呦&#xff01; docker run --env MODEstandalone --name nacos -d -p 884…

初中 英文

英語過去式與過去完成進行時是在英語語法學習中&#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;…

gitlab 修改HTTP連接方式中的IP和端口

修改gitlab.yml文件 cd /opt/gitlab/embedded/service/gitlab-rails/config vim gitlab.yml 修改gitlab host&#xff1a;要修改的IPport&#xff1a;要修改的端口重啟gitlab gitlab-ctl restart

Coding Interview Guide -- 向有序的環形單鏈表中插入新節點

【題目】 一個環形單鏈表從頭節點head開始不降序&#xff0c;同時由最后的節點指回頭節點。給定這樣一個環形單鏈表的頭節點head和一個整數num&#xff0c;請生成節點值為num的新節點&#xff0c;并插入到這個環形鏈表中&#xff0c;保證調整后的鏈表依然有序 1 public Nod…

真香定律!Android動態換膚實現原理解析,原理+實戰+視頻+源碼

自己項目中一直都是用的開源的xUtils框架&#xff0c;包括BitmapUtils、DbUtils、ViewUtils和HttpUtils四大模塊&#xff0c;這四大模塊都是項目中比較常用的。最近決定研究一下xUtils的源碼&#xff0c;用了這么久總得知道它的實現原理吧。我是先從先從BitmapUtils模塊開始的。…

使用Docker啟動Grafana環境

docker search grafana docker pull grafana/grafana docker imagesdocker run -d -p 3000:3000 grafana/grafana 啟動成功,進入本機瀏覽器訪問 http://localhost:3000 使用admin/admin進入系統

js包裝類型的裝箱拆箱

https://www.jb51.net/article/155820.htm https://juejin.im/post/5cbaf130518825325050fb0a https://juejin.im/post/5ccfb58f518825405a198fcd轉載于:https://www.cnblogs.com/little-ab/p/11025952.html