先說概念:? ?
????虛方法(virtual):在父類中的方法名前添加“ virtual ”關(guān)鍵字,實(shí)現(xiàn)父類和子類方法的動(dòng)態(tài)綁定(在SV中稱為動(dòng)態(tài)方法查找)。
? ? 動(dòng)態(tài)查找:利用類的多態(tài)性,在設(shè)計(jì)和使用類的時(shí)候,不需擔(dān)心句柄指向的對(duì)象類型到底是父類還是子類,直接能夠優(yōu)先去調(diào)用實(shí)例對(duì)象本身對(duì)應(yīng)的方法。
? ? 類型轉(zhuǎn)換:子類句柄可以賦給父類句柄,因?yàn)樽宇悓?duì)象通常包含父類對(duì)象的所有,父類句柄卻不能直接賦給子類句柄,故需要類型轉(zhuǎn)換。使用系統(tǒng)函數(shù)$cast(),它是一個(gè)帶返回值的函數(shù),如果轉(zhuǎn)化成功,$cast(target, source)會(huì)返回1,如果轉(zhuǎn)化失敗,$cast(target, source)會(huì)返回0,但是不會(huì)報(bào)錯(cuò)。所以通過if語(yǔ)句或者斷言assert來判斷是否轉(zhuǎn)化成功,然后進(jìn)行下一步操作。
為什么父類句柄經(jīng)常需要轉(zhuǎn)換為子類句柄?
????????因?yàn)楦割惥浔谥赶蛞粋€(gè)子類對(duì)象的時(shí)候,它只能訪問子類中,父類的那部分成員。如果想訪問子類中的成員/方法,則必須要轉(zhuǎn)換為子類句柄才能訪問。
虛方法如何聲明?該在哪里聲明?
????????先說目的,虛方法聲明是為了父類句柄訪問子類對(duì)象的成員/方法時(shí),不經(jīng)過句柄轉(zhuǎn)換$cast()這一麻煩操作。? ? ? ? 那么我們可以通過在父類中對(duì)以后可能會(huì)被子類繼承的方法前,聲明 “virtual”關(guān)鍵詞。
????????這樣,當(dāng)程序調(diào)用該方法時(shí),SystemVerilog會(huì)根據(jù)句柄指向 對(duì)象 的類型,而非 句柄 的類型,來動(dòng)態(tài)決定調(diào)用什么方法(即動(dòng)態(tài)調(diào)用)。如果該方法在父類中沒有聲明virtual,則SV會(huì)根據(jù)句柄的類型來調(diào)用同名方法,起不到效果了。
需注意:
1. 上述使用虛方法來實(shí)現(xiàn)方法的動(dòng)態(tài)調(diào)用時(shí),子類中相應(yīng)的方法的方法名、方法的返回類型以及方法的參數(shù),必須和父類中的方法保持一致,否則子類定義的方法就不叫繼承,應(yīng)該叫重寫(override)了。
2. 一般在父類中通過virtual聲明虛方法,只需聲明一次即可,而其子類則無(wú)需再次聲明。子類及其后續(xù)子類的同名方法,添不添加,均視為虛方法屬性。
3. 除了new()函數(shù)不能添加virtual,父類的其它方法均可以添加virtual聲明,但類的成員變量不能添加virtual聲明。換句話說——父類句柄想訪問子類對(duì)象中成員,只能通過cast()轉(zhuǎn)換。