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 系统Verilog中的类类型,不能作为子类构造和扩展_Oop_Abstract Class_Subclass_System Verilog - Fatal编程技术网

Oop 系统Verilog中的类类型,不能作为子类构造和扩展

Oop 系统Verilog中的类类型,不能作为子类构造和扩展,oop,abstract-class,subclass,system-verilog,Oop,Abstract Class,Subclass,System Verilog,我已经用Virtual关键字创建了系统Verilog类。 将虚拟关键字作为前缀添加到类abc后,它将成为抽象类,无法使用new()构造函数为其创建对象。若这样做,用户将获得编译错误 虚拟课堂; ........ 末级 但同时,没有其他类可以从abc类扩展为子类。i、 e.abc类不能扩展为子类 SV是否支持不能使用new()构造函数(如抽象类)创建且不能扩展到子类的任何此类类类型。 如果system verilog支持任何此类类类型,那么在什么情况下定义此类将很有帮助 任何输入都会有很大帮助。我

我已经用Virtual关键字创建了系统Verilog类。 将虚拟关键字作为前缀添加到类abc后,它将成为抽象类,无法使用new()构造函数为其创建对象。若这样做,用户将获得编译错误

虚拟课堂; ........ 末级

但同时,没有其他类可以从abc类扩展为子类。i、 e.abc类不能扩展为子类

SV是否支持不能使用new()构造函数(如抽象类)创建且不能扩展到子类的任何此类类类型。 如果system verilog支持任何此类类类型,那么在什么情况下定义此类将很有帮助


任何输入都会有很大帮助。

我不完全理解你的意思。是的,您可以声明一个抽象(虚拟)类,您可以将其扩展到任何其他类中。你为什么说你不能

下面是一个简单的例子:

virtual class X;
  function new();
  endfunction

  function print();
    $display("hello world");
  endfunction

endclass

class Y extends X;
endclass

module A();
  Y y;
  X x;
  initial begin
    y = new();
    x = y;
    x.print();
  end
  
endmodule

Y
是一个派生类,您可以通过扩展类
X

轻松做到这一点,但不能扩展虚拟/抽象类的说法是错误的。必须扩展它才能将其构造为派生子类。如果您试图构造一个虚拟类,您将得到一个错误

SystemVerilog没有阻止您扩展任何类的机制,但它确实可以通过将构造函数声明为
local
来阻止您构建类的任何扩展。如果这样做,则必须提供其他静态方法来调用本地构造函数。这是典型的单例模式


现在,
A
的构造函数只能调用一次,并且您不能构造
A
的扩展子类。它的构造函数需要调用super.new(),这已被定为非法。

我猜您只想将该类用于
静态
方法

正如@dave_59已经说过的,您可以声明构造函数
local

class some_class;

  local function new();
    // intentionally empty
  endfunction

endclass
class some_subclass extends some_class;

  // even if we don't explicitly declare a constructor, the following is added
  // automatically
  //
  // function new();
  //   super.new();  // leads to compile error
  // endfunction

endclass
当您尝试实例化它时,这将导致编译错误:

some_class obj = new(); // leads to compile error
如果扩展该类,还将导致编译错误。这是因为任何子类都会隐式调用
super.new()
,这是非法的,因为
super.new
local

class some_class;

  local function new();
    // intentionally empty
  endfunction

endclass
class some_subclass extends some_class;

  // even if we don't explicitly declare a constructor, the following is added
  // automatically
  //
  // function new();
  //   super.new();  // leads to compile error
  // endfunction

endclass

感谢@dave_59的澄清,我一直在寻找本地函数new,但无法将查询转化为文字。感谢Tudor Timi澄清本地函数new在基类中的工作,以及非法的super.new()在其扩展类中的工作。在发布的查询中,我想了解,在SV中,用户是否可以声明一个类,只创建一次对象,当尝试将其扩展到任何子类时,都会出错。dave_59和Tudor Timi回答并澄清了我对本地函数new及其使用的理解。谢谢你的意见@Serge