4.2-类中的overwrite,override(多态),抽象类与纯虚函数
资料来源:
(1)公众号-芯片学堂;
(2)The UVM Primer;
(3)硅芯思见:【118】SystemVerilog没有那么多的OVER---overwrite_override_overload (qq.com)
1.overwrite
(1)overwrite发生在子类和基类之间,即不同的类域之间。
(2)overwrite发生在同名函数中,同不同参无所谓。发生overwrite的函数必须是非虚函数。
(3)在调用被overwrite的函数时,会根据句柄(handle)的类型决定调用基类中的还是子类中的同名函数。
补充:overwrite的一个有趣的例子(在派生类的函数中,调用基类同名函数,和深度copy的机制相同);
在下面的例子中,派生类只用关心它所引入的新的变量,基类中的变量由基类的同名函数负责处理;
2.override(多态与虚函数)
(1)overwrite发生在子类和基类之间,即不同的类域之间。
(2)Override发生在子类和基类之间的同名同参且返回值类型相同的函数上并且该同名函数在基类中要求被声明为虚函数。跟上面的overwrite的区别就是多了个函数参数相同和基类中为虚函数这两个要求。
(3)当发生override的函数被调用的时候,会根据句柄指向的对象类型来动态地决定要调用基类中还是子类中的同名函数。
3.抽象类与纯虚函数
(1)在上面的base class中,为了强制user覆盖make_sound()方法,在基类的make_sound方法中调用$fatal函数;但是这意味着user需要等待仿真结果并且最终遇到fatal error;在大规模的rtl design中,这会消耗半小时或者更多;
(2)如果想要更早发现这种错误情况,即没有在派生类中实现make_sound方法以覆盖基类的make_sound方法,需要采用抽象类;
(3)抽象类只能作为基类,并且不能被直接实例化,使用"virtual"关键词进行定义;
(4)在定义抽象类时,可以定义纯虚方法;纯虚方法没有实体,并且必须在派生类中进行覆盖;如果没有覆盖,会报编译错误;