(1) overload——重载
- 简单来说overload是重载 允许一个class有两个不同参的函数,sv不支持(2) overwrite——重写
- overwrite发生在子类和父类之间,即不同的类域之间。overwrite发生在同名函数中,同不同参无所谓。
- 发生overwrite的函数必须是非虚函数,因为一旦父类中函数被声明为虚函数,调用同名函数时会发生多态(会根据对象类型来决定调用父类中的还是子类中的同名函数),当这些条件满足的时候,我们就说这个函数被overwrite了;
- 在调用被overwrite的函数时,会根据句柄的类型(而不是对象的类型)决定调用父类中的还是子类中的同名函数(与override会有明显的区别);
(3) override——覆盖
- override发生在子类和基类之间的同名同参函数身上,并且该同名函数在基类中要求被声明为虚函数。
- 和overwrite的区别就是多了函数参数相同和基类中必须为虚函数这两个要求,当这些条件都满足时,就可以认为这个函数在类间被override了
- 当发生override的函数被调用的时候,会根据句柄指向的对象类型来动态地决定要调用基类中还是子类中的同名函数(与多态性结合);
class A;
function void print_1(string str);
$display({str,": not virtual function 1 in class A"});
endfunction
virtual function void vri_print_1(string str);
$display({str,": virtual function 1 in class A"});
endfunction
function void print_2(string str);
$display({str,": not virtual function 2 in class A"});
endfunction
virtual function void vir_print_2(string str);
$display({str,": virtual function 2 in class A"});
endfunction
end
class B extends A;
function void print_1(string str);
$display({str,": not virtual function 1 in class B"});
endfunction
virtual function void vri_print_1(string str);
$display({str,": virtual function 1 in class B"});
endfunction
function void print_2(int number);
$display("%d: not virtual function 2 in class B", number);
endfunction
// Error override必须是同名同参的虚函数
// virtual function void vir_print_2(int number);
// $display("%d: virtual function 2 in class A", number);
// endfunction
endclass
module tb;
A a_inst_1;
A a_inst_2;
B b_inst_1;
initial begin
a_inst_1 = new();
b_inst_1 = new();
a_inst_2 = b_inst_1; // 多态性
$display("The object address of a_inst_1: %h", a_inst_1);
$display("The object address of b_inst_1: %h", b_inst_1);
$display("The object address of a_inst_2: %h", a_inst_2);
$diaply("*************************************");
a_inst_1.print_1("a_inst_1");
b_inst_1.print_1("b_inst_1");
a_inst_2.print_1("a_inst_2");
$diaply("*************************************");
a_inst_1.vri_print_1("a_inst_1");
b_inst_1.vri_print_1("b_inst_1");
a_inst_2.vri_print_1("a_inst_2");
$diaply("*************************************");
a_inst_1.print_2("a_inst_1");
b_inst_1.print_2(666);
a_inst_2.print_2("a_inst_2");
end
endmodule
//*************************run_result**************************
// The object address of a_inst_1: f0568842
// The object address of a_inst_1: f0568870
// The object address of a_inst_1: f0568870
//***************************************************
// a_inst_1: not virtual function 1 in class A
// b_inst_1: not virtual function 1 in class B
// a_inst_2: not virtual function 1 in class A
//***************************************************
// a_inst_1: virtual function 1 in class A
// b_inst_1: virtual function 1 in class B
// a_inst_2: virtual function 1 in class B
//***************************************************
// a_inst_1: not virtual function 2 in class A
// 666: not virtual function 2 in class B
// a_inst_2: not virtual function 2 in class A