【system verilog】OOP屬性下的構造函數new,虛方法virtual和cast方法(2)

前言

接上一篇 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();

打印如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章