1.虚方法
在OOP中多个子程序使用一个共同的名字的现象叫做“多态”。虚方法就是一个基本的多态结构。
默认情况下,子类覆盖的方法并不会继承父类的同名方法,只有通过super.method() 的方式显示执行,才会达到继承父类方法的效果。
- 类的继承是继承父类的成员变量和成员方法
- 子类对象中即有从父类继承而来的,也有子类扩展的方法和变量
- 子类中重写的方法对父类是不可见的
要想子类重写父类的方法能被父类看到,那就需要虚方法。
class Transaction;
rand bit[31:0] src,dst,data[8];
bit[31:0] crc;
virtual functon void calc_crc();
crc=src^dst^data.xor;
endfunction
endclass:Transaction
class BadTr extends Transaction;
rand bit bad_crc;
virtual function void calc_crc();
super.calc_crc();
if(bad_crc) crc =~ crc;
endfunction
endclass:BadTr
Transaction tr;
BadTr bad;
initial begin
tr = new();
tr.calc_crc(); // 调用Transaction::calc_crc
bad = new();
bad.calc_crc();// 调用BadTr::calc_crc
tr = bad;
tr.calc_crc();//调用BadTr::calc_crc
end
当决定调用哪个虚方法时:
- SV 根据对象的类型,而非句柄的类型来决定调用什么方法(tr指向一个扩展类对象,所以调用的方法是BadTr::calc_crc)
- 如果没有对calc_crc使用virtual修饰符,SV根据句柄的类型tr,而不是对象的类型(调用Transaction::calc_crc)
注意:
- 在为父类定义方法时,如果该方法日后会被覆盖或者继承,那么加virtual;
- virtual只需要在父类声明一次,子类可以无需再次声明
- 虚方法的继承要和父类的参数和返回值类型相同,否则定义的方法就不算重写父类方法
- 虚方法尽量定义在最底层的父类
- 不能给成员变量添加virtual,不能用父类句柄找到子类中的成员变量