这个问题可能适用于所有/大多数面向对象的编程语言,但我只关心SystemVerilog方面。 我以为我了解了多态性,直到前几天我与一位同事交谈时,这种情况才出现,我意识到我不知道该怎么做。 以下是本讨论要考虑的两个类-
class four_wheeler;
virtual function void vehicle_type();
$display("Four-wheeler");
endfunction:vehicle_type
virtual task colour();
$display("Many colours");
endtask:colour
endclass:four_wheeler
class jaguar extends four_wheeler;
function void vehicle_type();
$display("Jaguar");
endfunction:vehicle_type
task colour();
$display("Black");
endtask:colour
endclass:jaguar
program sv_prog;
initial begin
four_wheeler four_wheeler_h;
jaguar jaguar_h;
four_wheeler_h = new();
jaguar_h = new();
four_wheeler_h = jaguar_h;
four_wheeler_h.vehicle_type();
end
endprogram: sv_prog
我想使用自己的对象访问基类four_wheeler中的vehicle_type()
函数。我可以在four_wheeler_h.vehicle_type()
副本之前通过four_wheeler_h = jaguar_h
进行此操作。常规OOP工作!但是复制手柄后可以做吗?
我可以在美洲虎类super
方法中使用vehicle_type()
关键字:
function void vehicle_type();
super.vehicle_type();
$display("Jaguar");
endfunction:vehicle_type
并获得输出:
Four-wheeler
Jaguar
但是我对从程序块本身执行此操作更感兴趣,而不必修改jaguar类中的函数。有什么办法可以实现?也许可以使用程序块本身中的super
。
答案 0 :(得分:2)
恐怕与c ++不同,您的执行方式非常有限(如java)。因此,所有语言都是不同的。
类似于Java,SystemVerilog为您提供了关键字“ super”,您可以在类成员中使用它。您将必须创建一个特定的类成员函数来访问其在非类范围内的基(超级)类成员:
npm install
现在您可以使用
class jaguar extends four_wheeler;
...
function super_vehicle_type();
super.vehicle_type();
endfunction
endclass:jaguar
您还可以在函数中使用类范围标识符来访问任何基类。
jaguar_h.super_vehicle_type();
在上述情况下,您可以使用任何基类(而不是four_wheeler)作为类范围。
答案 1 :(得分:2)
简单的答案是否,这不是虚拟方法的工作原理。多态性定义了它,以至于您不应该知道自己正在处理覆盖的类对象。这就像询问您是否已将成员声明为local
或protected
一样,是否可以从类外部访问该成员。答案也是否。 但是 ...如果您在基类中提供了其他访问器方法,则可以通过多种方法来控制对这些成员变量和方法的访问。
class base;
local int base_variable;
virtual function void do_this;
endfunction
function int get_base_variable;
return base_variable;
endfunction
function void base_to_this;
base::do_this();
endfunction
endless