SV中父类与子类句柄转换,即子类的扩展类与父类句柄转换等问题

SV中父类与子类句柄转换,即子类的扩展类与父类句柄转换等问题,第1张

SV中父类与子类句柄转换,即子类的扩展类与父类句柄转换等问题


如上图,表示了父类与子类的继承关系以及对象关系。

因此假设B继承A,那么子类B所能访问的成员变量同时包括自己的成员和父类的所有成员变量,也就是图中的大三角;而父类A仅能访问自己以及子类中属于自己的成员变量,不可访问子类的成员变量,即图中的小三角这是编译器规定,同时这个业与C/C++等高级语言保持一致。

那么就有一个问题,实际写代码过程中,避免不了类型的转换问题,父类和子类句柄之间该如何转换?

根据图中的包含与被包含关系,我们可以清楚看到,子类包含了父类,因此:

父类句柄=子类句柄,顺理成章,但反过来就不行。

为什么?因为子类包含了父类成员变量,那么把子类句柄赋值给父类,父类按照编译器规定就可以仅访问子类中的属于自己的成员变量,如果强行把父类句柄用=赋值给子类,那么子类句柄就访问不到自己的成员变量,因为父类句柄仅可以访问属于自己的成员变量,那么问题来了,把子类句柄转换成父类后怎么转回来?sv中提供一种方法:$cast(子类,父类),前提是先有 父类句柄=子类句柄 ,必须保证父类句柄指向的是子类对象才可以使用cast。此时也有个问题:

$cast(父类,子类)行不行? 答案是:当然可以,这个等同于父类句柄=子类句柄

那么接下来还有一个问题:
子类的扩展类句柄赋值给其父类行不行?等同于孙子的句柄赋值给爷爷, 答案是:当然可以,因为爸爸从爷爷哪里学会了所有技能,并且自创了技能,而孙子不仅从哪里又学会了爸爸所有会的技能,也自己创新了一些技能,会的更多了,就像最开始那个三角,子类集成类所包含成员变量是一个包含了子类及父类更大的三角形。

因此,就会有一道题:
B集成A,C集成B,那么A=C,"$ cast(B,A)合不合法?答案是合法
总结起来就是:
1、$cast(father,son)作用等于father=son;

2、father没有引用过子类(son)句柄:$cast(son,father)返回值为0,cast失败

3、father=son1(son的扩展类son1);$cast(son,father)返回值为1,cast成功

接下来我们看一段代码:

`include "param_def.v"

 module test;
class A;

  string name;
  function new(string name="A");
   this.name=name;
  endfunction
endclass;
class B extends A;

endclass;
class C extends B;
 
endclass;

  A a=new();
  B b=new();
  C c=new();
initial begin
 a=b;
 $cast(b,a);
 a=c;
 $cast(b,a);
end;
endmodule

  


上例中:均是合法 *** 作

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5703214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存