层次结构中的动态转换

时间:2016-06-20 07:59:10

标签: oop inheritance casting system-verilog uvm

引用SV LRM。

  

将子类类型的表达式赋给a总是合法的   继承树中更高类类型的变量(超类   表达式的祖先或祖先)。直接是非法的   将超类类型的变量赋值给其中一个变量   子类型。但是,$ cast可用于分配超类   处理超类句柄提供的子类类型的变量   指的是与子类兼容的赋值对象   变量

当我们尝试将超类实例分配给子类实例时,转换会失败的场景是什么时候?我理解每当我们尝试转换两个彼此不兼容的实例时,转换会失败。如果它们属于同一层次结构树,那么铸造会失败吗?如果是的话,我可以知道什么时候?

1 个答案:

答案 0 :(得分:3)

您永远不会对类实例进行赋值 - 您可以使用类类型对变量进行赋值。区别是微妙的,但重要的是要知道类类型与类变量和类实例之间的区别。

LRM所指的情况是这个

class A; endclass
class B extends A; endclass
class C extends A; endclass

A a_h;
B b_h;
C c_h;

b_h = new;
a_h = b_h; // always legal to go up the inheritance tree
$cast(b_h, a_h); // $cast required - will succeed
$cast(c_h, a_h); // $cast required - will fail

第二个$ cast失败,因为a_h持有类型B的类实例的句柄,并且试图将它分配给类型C的类变量。这段代码非常简单但是在更大的环境中,它并不总是很容易知道在a_h中保存了什么实例,SystemVerilog需要运行时检查。