module virtualmenthods; //------------------------------------------------------------- class BasePacket; int A = 1; int B = 2; int C = 3; function void printA; $display("BasePacket::A is %d",A); endfunction : printA virtual function void printB; $display("BasePacket::B is %d",B); endfunction : printB virtual function void printC; $display("BasePacket::C is %d",C); endfunction : printC endclass : BasePacket //------------------------------------------------------------- class MyPacket1 extends BasePacket; int A = 4; int B = 5; int C = 6; function void printA; $display("MyPacket1::A is %d",A); endfunction : printA function void printB; $display("MyPacket1::B is %d",B); endfunction : printB virtual function void printC; $display("MyPacket1::C is %d",C); endfunction : printC endclass : MyPacket1 //------------------------------------------------------------- class ExtPacket extends MyPacket1; int A = 7; int B = 8; int C = 9; function void printA; $display("ExtPacket::A is %d",A); endfunction : printA virtual function void printB; $display("ExtPacket::B is %d",B); endfunction : printB // No printC function in ExtPacket // Inherit printC from MyPacket1 endclass : ExtPacket //------------------------------------------------------------- BasePacket P1 = new; MyPacket1 P2 = new; ExtPacket P3 = new; initial begin P1.printA; // displays ‘BasePacket::A is 1’ P1.printB; // displays ‘BasePacket::B is 2’ P1.printC; // displays ‘BasePacket::C is 3’ //----------------------------------------------------------- P1 = P2; // P1 has a handle to a MyPacket1 object P1.printA; // displays ‘BasePacket::A is 1’ P1.printB; // displays ‘MyPacket1::B is 5’ - latest derived method P1.printC; // displays ‘MyPacket1::C is 6’ - latest derived method P2.printA; // displays ‘MyPacket1::A is 4’ P2.printB; // displays ‘MyPacket1::B is 5’ P2.printC; // displays ‘MyPacket1::C is 6’ //----------------------------------------------------------- P1 = P3; // P1 has a handle to an ExtPacket object P2 = P3; // P2 has a handle to an ExtPacket object P1.printA; // displays ‘BasePacket::A is 1’ P1.printB; // displays ‘ExtPacket::B is 8’ - ??? P1.printC; // displays ‘MyPacket1::C is 9’ - ??? P2.printA; // displays ‘MyPacket1::A is 4’ P2.printB; // displays ‘ExtPacket::B is 8’ - ??? (virtual again???) P2.printC; // displays ‘MyPacket1::C is 9’ - ??? (9???) P3.printA; // displays ‘ExtPacket::A is 7’ P3.printB; // displays ‘ExtPacket::B is 8’ P3.printC; // displays ‘MyPacket1::C is 9’ - ??? (9???) //----------------------------------------------------------- end endmodule