一
class是类;extends是继承,左边是子类,右边是父类。继承——子类会继承父类所有的成员。
class packet;
integer i = 1;
function new(int val);
i = val + 1;
endfuntion
function shift();
i = i << 1;
endfunction
endclass
class linkedpacked extends packet; #继承
integer i = 3;
function new(int val);
super.new(val);
if(val >= 2)
i = val;
endfunction
function shift();
super.shift();
i = i << 2;
endfunction
endclass
module tb;
initial begin
packet p = new(3);
linkedpacked lp = new(1);
//packet tmp;
//tmp = lp;
$display("p.i = %0d", p.i);
$display("lp.i = %0d", lp.i);
p.shift();
$display("after shift, p.i = %0d", p.i);
lp.shift();
$display("after shift, lp.i = %0d", lp.i);
//$display("tmp.i = %0d", tmp.i);
end
endmodule
子类和父类如果出现同名的函数,若子类有super,表示子类函数shift首先执行父类的函数shift,再执行子类的内容。
子类继承父类时,new函数的要求;对于new函数,必须要完成继承。
这个视频的例子。——继承的例子。
父类引用指向子类对象,对象调用的方法如果已经被子类重写过了则调用的是子类中重写的方法,而不是父类中的方法;
父类i=5,不影响子类的i的值。此处调用父类完全是因为语法的原因
父类的i和子类的i各不影响。
二
子类继承父类方法,方法名一致,参数一致。若子类要继承父类,调用super.方法即可,在子类new里都要写super.方法(new)。 子类的方法可以和父类方法相同,子类的成员变量不要和父类成员变量重名。
子类句柄可赋值给父类句柄,访问的空间变小了而已。子类的句柄访问不到,可用父类句柄访问。 子类赋给父类的动作,在编译时就认为是安全的。编译时不允许的是,父类句柄赋给子类句柄;因为不知道仿真的时候,父类的句柄指向的是父类对象or子类对象。 只有在运行阶段,且父类句柄指向子类对象,那父类句柄可以赋给子类句柄——$cast(子类句柄,父类句柄)。
总结上面就是,子类句柄可以赋值给父类句柄(但是一旦赋值给父类句柄以后,父类句柄和子类句柄在索引上查找的变量的范围就不一样了),父类句柄只能访问父类部分的区域。 如下图所示,(用lp能够找到子类的i,k和父类的m,但是找不到父类的i;若用tmp的父类句柄只能找到父类的i,m;但是找不到子类的i,k。)
ACD
总结,父类子类中。可以将子类句柄直接赋值给父类句柄;子类可以拥有与父类同名的成员方法/变量;父类句柄只能访问父类部分的区域。