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

Posted 秦枫-_-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

  


上例中:均是合法操作

以上是关于SV中父类与子类句柄转换,即子类的扩展类与父类句柄转换等问题的主要内容,如果未能解决你的问题,请参考以下文章

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

$cast使用,父类与子类句柄(handle)的关系

Java中父类与子类的转换问题

java中父类与子类的关系以及使用

父类与子类的转换as,is

父类对象是不是可以强制转换成子类的对象?为啥?