往期内容
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(1)_system verilog 构造函数_尼德兰的喵的博客-CSDN博客
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(2)_尼德兰的喵的博客-CSDN博客
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(3)_system verilog 构造函数_尼德兰的喵的博客-CSDN博客
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(4)_尼德兰的喵的博客-CSDN博客
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(5)_$cast会检查空句柄吗_尼德兰的喵的博客-CSDN博客
正文
前几天有朋友和我讨论,明明$cast函数的功能是修改句柄的指向,为什么我们总是称之为强制类型转换函数?下班的路上我想了一下,感觉还是因为句柄的指向规则和调用特性使得$cast看起来确实是在完成强制类型转换功能。
$cast(a, b)本质上确实是在检查左侧句柄是否可以指向右侧句柄所指向的实例空间,并完成句柄向实体空间的指向功能,这点在本系列文章的第三篇中做过说明,图方便我再放一下这个图:
从这一点看,实际上右侧的实例类型并没有被强制转换转换成左侧句柄的类型。但是呢,别忘了还有另外一个性质:父类句柄指向子类空间时,无法调用父类中不存在、子类拓展出来的方法,具体实验请参见系列文章的第四篇。
这就导致了如果是子类句柄指向子类空间,那么可以访问全部属性和方法。而父类句柄指向子类空间只能访问子类继承的属性和方法。从结果上看,仿佛是右侧的子类空间被强制转换为左侧父类句柄的数据类型了。
因此,称$cast为强制类型转换函数,也就非常的合理了。