先說概念:? ?
????虛方法(virtual):在父類中的方法名前添加“ virtual ”關(guān)鍵字易稠,實(shí)現(xiàn)父類和子類方法的動態(tài)綁定(在SV中稱為動態(tài)方法查找)筋搏。
? ? 動態(tài)查找:利用類的多態(tài)性同云,在設(shè)計(jì)和使用類的時(shí)候糖权,不需擔(dān)心句柄指向的對象類型到底是父類還是子類,直接能夠優(yōu)先去調(diào)用實(shí)例對象本身對應(yīng)的方法梢杭。
? ? 類型轉(zhuǎn)換:子類句柄可以賦給父類句柄温兼,因?yàn)樽宇悓ο笸ǔ0割悓ο蟮乃校割惥浔鷧s不能直接賦給子類句柄武契,故需要類型轉(zhuǎn)換。使用系統(tǒng)函數(shù)$cast()荡含,它是一個(gè)帶返回值的函數(shù)咒唆,如果轉(zhuǎn)化成功,$cast(target, source)會返回1释液,如果轉(zhuǎn)化失敗全释,$cast(target, source)會返回0,但是不會報(bào)錯(cuò)误债。所以通過if語句或者斷言assert來判斷是否轉(zhuǎn)化成功浸船,然后進(jìn)行下一步操作。
為什么父類句柄經(jīng)常需要轉(zhuǎn)換為子類句柄寝蹈?
????????因?yàn)楦割惥浔谥赶蛞粋€(gè)子類對象的時(shí)候李命,它只能訪問子類中,父類的那部分成員箫老。如果想訪問子類中的成員/方法封字,則必須要轉(zhuǎn)換為子類句柄才能訪問。
虛方法如何聲明耍鬓?該在哪里聲明阔籽?
????????先說目的,虛方法聲明是為了父類句柄訪問子類對象的成員/方法時(shí)牲蜀,不經(jīng)過句柄轉(zhuǎn)換$cast()這一麻煩操作笆制。? ? ? ? 那么我們可以通過在父類中對以后可能會被子類繼承的方法前,聲明 “virtual”關(guān)鍵詞涣达。
????????這樣在辆,當(dāng)程序調(diào)用該方法時(shí),SystemVerilog會根據(jù)句柄指向 對象 的類型峭判,而非 句柄 的類型开缎,來動態(tài)決定調(diào)用什么方法(即動態(tài)調(diào)用)。如果該方法在父類中沒有聲明virtual林螃,則SV會根據(jù)句柄的類型來調(diào)用同名方法奕删,起不到效果了。
需注意:
1. 上述使用虛方法來實(shí)現(xiàn)方法的動態(tài)調(diào)用時(shí)疗认,子類中相應(yīng)的方法的方法名完残、方法的返回類型以及方法的參數(shù)伏钠,必須和父類中的方法保持一致,否則子類定義的方法就不叫繼承谨设,應(yīng)該叫重寫(override)了熟掂。
2. 一般在父類中通過virtual聲明虛方法,只需聲明一次即可扎拣,而其子類則無需再次聲明赴肚。子類及其后續(xù)子類的同名方法,添不添加二蓝,均視為虛方法屬性誉券。
3. 除了new()函數(shù)不能添加virtual,父類的其它方法均可以添加virtual聲明刊愚,但類的成員變量不能添加virtual聲明踊跟。換句話說——父類句柄想訪問子類對象中成員,只能通過cast()轉(zhuǎn)換鸥诽。