这个问题可能适用于所有/大多数面向对象的编程语言,但我只关心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工作!但是我可以在手柄副本之后这样做吗?我可以在jaguar class super
方法中使用vehicle_type()
关键字:
function void vehicle_type();
super.vehicle_type();
$display("Jaguar");
endfunction:vehicle_type
并得到输出:
Four-wheeler
Jaguar
但我更感兴趣的是从程序块本身执行此操作而无需修改jaguar类中的函数。有什么办法可以实现吗?也许从程序块本身使用super
。
我担心与c ++不同,你在这方面的表现非常有限(比如在java中)。所以,所有语言都不同。
与java类似,SystemVerilog为您提供了可在类成员中使用的关键字“super”。您必须创建一个特定的类成员函数来访问非类作用域中的基类(超级)类成员:
class jaguar extends four_wheeler;
...
function super_vehicle_type();
super.vehicle_type();
endfunction
endclass:jaguar
现在你可以使用了
jaguar_h.super_vehicle_type();
您还可以在函数中使用类范围标识符来访问任何基类。
function super_vehicle_type();
four_wheeler::vehicle_type();
endfunction
在上面的例子中,您可以使用任何基类(而不是four_wheeler)作为类范围。
简单的答案是否定的,这不是虚拟方法的工作方式。多态性在这样的地方定义它,你不应该意识到你正在处理一个被重写的类对象。这就像问你是否已宣布成员为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