类型转换
类型转换分为动态转换和静态转换,静态转换只需要在转换的表达式之前加上单引号就可以了,静态转换并不会对得到的转换值进行检查,所以即使发生错误,我们也不得而知;动态转换需要使用系统函数$cast(tgt , src)做转换。静态转换和动态转换都需要加上操作符后者系统函数,所以被称之为显示转换。
什么是隐式转换?不需要进转换的操作。很经典的例子就是在进行赋值操作的时候等式左边是四位的矢量,等式右边是五位的矢量,这种赋值操作会进行位宽拓展,然后再进行赋值。
什么时候用到动态转换?在使用类的时候,类句柄的向下转换(父类句柄转换为子类句柄)需要进行动态转换,否则会发生编译错误。动态转换会显示1/0来表达转换成功或者失败

tr.display 最终会采用Transaction::display的方式来打印,因为tr是父类的句柄,父类的句柄里面只能看见父类的方法,父类是小三角形,子类的大三角形,父类的视野是小于子类的。将一个父类句柄赋值给一个子类句柄并不总是法的。 但是SV编译器对这种直接赋值的做法是禁止的。也就是说无论父类句柄是否真正指向了一个子类对象,赋值给子类句柄时, 编译都将出现错误。 因此需要实现句柄类型的动态转换。 $cast(tgt, src)会检查句柄所指向的对象类型,而不仅仅检查句柄本身。 一旦源对象跟目的句柄是同一类型, 或者是目的句柄的扩展, $cast()函数执行即会成功,返回1,否则返回0。

本文探讨了类型转换(静态与动态)、虚方法的概念及其在类继承中的应用,包括动态绑定与静态绑定的区别,以及对象拷贝、回调函数和参数化类的实践。重点讲解了如何处理父类句柄向子类转换、动态方法查找和有效利用虚方法提升代码复用性。
最低0.47元/天 解锁文章
1273

被折叠的 条评论
为什么被折叠?



