Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 层次结构中的动态转换_Oop_Inheritance_Casting_System Verilog_Uvm - Fatal编程技术网

Oop 层次结构中的动态转换

Oop 层次结构中的动态转换,oop,inheritance,casting,system-verilog,uvm,Oop,Inheritance,Casting,System Verilog,Uvm,引用SV LRM 将子类类型的表达式指定给 继承树中较高级别的类类型的变量(超类 或表达式类型的祖先)。直接接触他人是违法的 将超类类型的变量指定给其 子类类型。但是,$cast可用于指定超类 由超类句柄提供的子类类型变量的句柄 指与子类的赋值兼容的对象 变数 当我们尝试将超类实例分配给子类实例时,什么情况下强制转换会失败?我理解,每当我们试图转换两个彼此不兼容的实例时,转换都会失败。如果它们落在同一个等级树下,铸造会失败吗?如果是这样,我可以知道什么时候吗?您从未对类实例进行赋值-您对具有类类

引用SV LRM

将子类类型的表达式指定给 继承树中较高级别的类类型的变量(超类 或表达式类型的祖先)。直接接触他人是违法的 将超类类型的变量指定给其 子类类型。但是,$cast可用于指定超类 由超类句柄提供的子类类型变量的句柄 指与子类的赋值兼容的对象 变数


当我们尝试将超类实例分配给子类实例时,什么情况下强制转换会失败?我理解,每当我们试图转换两个彼此不兼容的实例时,转换都会失败。如果它们落在同一个等级树下,铸造会失败吗?如果是这样,我可以知道什么时候吗?

您从未对类实例进行赋值-您对具有类类型的变量进行赋值。区别很微妙,但了解类类型之间的区别以及如何将其应用于类变量和类实例很重要

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的类变量。此代码非常简单,但在更大的环境中,要知道某个实例中包含了什么实例并不总是容易的,SystemVerilog需要运行时检查。

您从不为类实例赋值,而是为具有类类型的变量赋值。区别很微妙,但了解类类型之间的区别以及如何将其应用于类变量和类实例很重要

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需要运行时检查。

,等级铸造应该只使用动态铸造吗?@user1978273,不。向上铸造时不应使用动态铸造。必须使用动态投射进行向下投射。谢谢Dave。你如何定义上行和下行?它是否基于类定义中的层次结构或规范?请参阅和,类强制转换是否应仅使用动态强制转换?@user1978273,否。向上强制转换时不应使用动态强制转换。必须使用动态投射进行向下投射。谢谢Dave。你如何定义上行和下行?是否基于类定义中的层次结构或规范?请参阅和