$cast(子,父),只有父类指向子类或者子类扩展类的时候才能转换成功。且转换后的句柄只能指向父类的空间。
如下代码及结果所示。
class father;
int i=0;
endclass
class child extends father;
int i=1;
int j=9;
endclass
module test;
child c1,c2;
father f1,f2;
int flag;
initial begin
f1=new();
c1=new();
flag=$cast(c1,f1); //父类指向父类,子类指向子类,转换失败
if(flag==1) begin
flag=0;
$display("1 success:f1.i=%0d",f1.i);
end
else $display("1 failed:f1.i=%0d",f1.i); //转换失败,父类指向父类的i=0
f1=c1; //父类指向子类对象,子类指向子类,转换成功
flag=$cast(c2,f1);
c2=new();
f1=c2; //父类句柄指向子类对象,f1.i=0还是父类的变量值
if(flag==1)begin
flag=0;
$display("2 success:f1.i=%0d",f1.i);
end
else $display("2 failed:f1.i=%0d",f1.i);//转换成功,但父类仍指向父类的i=0
end
endmodule