前言
感觉这个标题可以作为小知识汇总的博文了,继续上次的写:
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(3)
父类句柄的小疑问
今天跟同事讨论父类和子类的问题,就是在(3)中讨论的那个指向问题,然后延伸出了另外一个问题:父类指向子类空间时,能否调用父类不存在的、子类拓展出来的方法?
我坚持是可以的,我都指向子类空间了,空间里的东西还不是随便我用?于是乎压了一顿饭。
回来之后做实验:
class father;
int flow_id;
function new(int id);
$display("new father");
flow_id = id;
endfunction: new
endclass: father
class son extends father;
function new();
super.new(30);
$display("new son, flow_id='d%0d", flow_id);
endfunction: new
virtual function son_note();
$display("son_note");
endfunction: son_note
endclass: son
。。。
begin
father f = son::new();
f.son_note();
end
编译一下!
Error: C:\Users\gaoji\Desktop\sv test\environment.sv(98): Field/method name (son_note) not in 'f'
额,输了一顿饭。
回头想想也合理,基类句柄声明时候应该其中包含那些元素和方法是确定的,子类如果重载或者继承,那么句柄可以感知;如果拓展了新的方法,那么句柄无法感知也是合理的,也就是句柄被声明的一刻,他能访问哪些方法就确定了,不会随着后续指向其他空间而改变,