Is this below code the right way of coding?
This seems to work, but I am not sure if will be any issues with the code? like performance e.t.c.
Thanks in advance.
typedef ext_class_1 ;
typedef ext_class_2 ;
typedef ext_class_3 ;
class base_class;
base_class bc[3];
ext_class_1 ec1;
ext_class_2 ec2;
ext_class_3 ec3;
virtual function void display();
$display("Inside base class");
endfunction
task test ;
bc[0] = new();
bc[1] = new();
bc[2] = new();
ec1 = new();
ec2 = new();
ec3 = new();
bc[0].display();
bc[0] = ec1 ;
bc[0].display();
bc[1] = ec2;
bc[1].display();
bc[2] = ec3 ;
bc[2].display();
endtask
endclass
// extended class 1
class ext_class_1 extends base_class;
function void display();
$display("Inside extended class 1");
endfunction
endclass
// extended class 2
class ext_class_2 extends base_class;
function void display();
$display("Inside extended class 2");
endfunction
endclass
// extended class 3
class ext_class_3 extends base_class;
function void display();
$display("Inside extended class 3");
endfunction
endclass
// module
module class_polymorphism;
base_class bc;
initial begin
bc=new();
bc.test();
end
endmodule
In reply to ANASKU:
This code is perfectly legal, but not recommended. Typically a base class has no dependencies on its derivatives.
In reply to dave_59:
Thank you Dave.
I have a follow up question, in one of your comments you explained how inheritance can be used to access child class methods.
https://verificationacademy.com/forums/uvm/can-we-call-child-class-parent-class
I am trying to do the same but not seeing as expected. Below is the code -
class base_class;
virtual function void display1();
$display("Inside base class display1");
endfunction
virtual function void display2();
$display("Inside base class display2");
endfunction
virtual function void display3();
$display("Inside base class display3");
endfunction
endclass
// extended class 1
class ext_class_1 extends base_class;
function void display1();
super.display1();
$display("Inside extended class 1");
endfunction
endclass
// extended class 2
class ext_class_2 extends base_class;
function void display2();
super.display2();
$display("Inside extended class 2");
endfunction
endclass
// extended class 3
class ext_class_3 extends base_class;
function void display3();
super.display3();
$display("Inside extended class 3");
endfunction
endclass
// module
module class_polymorphism;
base_class bc;
ext_class_1 ec1;
ext_class_2 ec2;
ext_class_3 ec3;
initial begin
bc = new();
ec1 = new();
ec2 = new();
ec3 = new();
bc.display1();
bc.display2();
bc.display3();
end
endmodule
Output I am seeing :
Inside base class display1
Inside base class display2
Inside base class display3
What I was expecting :
Inside base class display1
Inside extended class 1
Inside base class display2
Inside extended class 2
Inside base class display3
Inside extended class 3
The extended class method was never called. What am I missing here?
In reply to ANASKU:
Hi,
You missed the handle assignment(parent_class_handle=child_class_handle). Chaeck this below code for clarification
class base_class;
virtual function void display1();
$display("Inside base class display1");
endfunction
virtual function void display2();
$display("Inside base class display2");
endfunction
virtual function void display3();
$display("Inside base class display3");
endfunction
endclass
// extended class 1
class ext_class_1 extends base_class;
function void display1();
super.display1();
$display("Inside extended class 1");
endfunction
endclass
// extended class 2
class ext_class_2 extends base_class;
function void display2();
super.display2();
$display("Inside extended class 2");
endfunction
endclass
// extended class 3
class ext_class_3 extends base_class;
function void display3();
super.display3();
$display("Inside extended class 3");
endfunction
endclass
// module
module class_polymorphism;
base_class bc;
ext_class_1 ec1;
ext_class_2 ec2;
ext_class_3 ec3;
initial begin
bc = new();
ec1 = new();
ec2 = new();
ec3 = new();
bc=ec1;
bc.display1();
bc=ec2;
bc.display2();
bc=ec3;
bc.display3();
end
endmodule