前言
接上一篇 https://blog.csdn.net/moon9999/article/details/106747444,本來想寫在一起的,但是後來我想想還希望繼續往前面補充,因此還是分成幾次來寫吧。
虛方法virtual
要點1:虛方法並不會影響方法的重載,無論是否定義爲虛方法,均可重載;
要點2:重載時,無論是否爲虛方法,均可以super父類的該方法;
class father;
int flow_id;
function new(int id);
$display("new father");
flow_id = id;
endfunction: new
virtual function vir_note();
$display("father vir_note");
endfunction: vir_note
function novir_note();
$display("father novir_note");
endfunction: novir_note
endclass: father
class son extends father;
function new();
super.new(30);
$display("new son, flow_id='d%0d", flow_id);
endfunction: new
virtual function vir_note();
super.vir_note();
$display("son vir_note");
endfunction: vir_note
function novir_note();
super.novir_note();
$display("son novir_note");
endfunction: novir_note
endclass: son
//env
...
father obj_fa1;
father obj_fa2;
son obj_sn1;
son obj_sn2;
obj_fa1 = new(15);
obj_sn1 = new();
obj_sn1.vir_note();
obj_sn1.novir_note();
...
打印如下:
要點3:virtual的多態屬性,主要表現在父類指針指向子類實例時,virtual方法會調用子類對應方法,非virtual方法會調用父類對應方法;
$cast(obj_fa1, obj_sn1);
obj_fa1.vir_note();
obj_fa1.novir_note();
打印如下:
要點4:三代繼承問題;
vir_note方法,father類中定義爲virtual,son中定義爲non-virtual,grandson中定義爲virtual;
novir_note方法,father類中定義爲non-virtual,son中定義爲virtual,grandson中定義爲non-virtual;
class father;
int flow_id;
function new(int id);
$display("new father");
flow_id = id;
endfunction: new
virtual function vir_note();
$display("father vir_note");
endfunction: vir_note
function novir_note();
$display("father novir_note");
endfunction: novir_note
endclass: father
class son extends father;
function new();
super.new(30);
$display("new son, flow_id='d%0d", flow_id);
endfunction: new
function vir_note();
$display("son vir_note");
endfunction: vir_note
virtual function novir_note();
$display("son novir_note");
endfunction: novir_note
endclass: son
class grandson extends son;
function new();
endfunction: new
virtual function vir_note();
$display("grandson vir_note");
endfunction: vir_note
function novir_note();
$display("grandson novir_note");
endfunction: novir_note
endclass: grandson
實驗1:
father obj_fa1;
son obj_sn1;
grandson obj_gs1;
obj_gs1 = new();
$cast(obj_fa1, obj_gs1);
obj_fa1.vir_note();
obj_fa1.novir_note();
打印如下:
實驗2:
father obj_fa1;
son obj_sn1;
grandson obj_gs1;
obj_gs1 = new();
$cast(obj_sn1, obj_gs1);
obj_sn1.vir_note();
obj_sn1.novir_note();
打印如下: