【转载】systemverilog关于虚方法和多态

1.虚方法与多态
1.1 背景:

///////////////////////////////////////////////////////////////////////////////////////////////////

基类:

///////////////////////////////////////////////////////////////////////////////////////////////////

class Packet;

 task build_payld();

      $display("Packet payld");

 endtask

 

 task build_packet();

      ......

      build_payld();

      ......

 endtask

///////////////////////////////////////////////////////////////////////////////////////////////////

派生类:

///////////////////////////////////////////////////////////////////////////////////////////////////

class DerivedPacket extends Packet;

   task build_payld();

      $display("DerivedPacket payld");

   endtask

endclass

///////////////////////////////////////////////////////////////////////////////////////////////////

测试代码:

///////////////////////////////////////////////////////////////////////////////////////////////////

module poly1;

     DerivedPacket der=new();

     initial  der.build_packet();

endmodule

///////////////////////////////////////////////////////////////////////////////////////////////////

测试结果:

///////////////////////////////////////////////////////////////////////////////////////////////////

Packet payld

///////////////////////////////////////////////////////////////////////////////////////////////////

测试结果分析:

///////////////////////////////////////////////////////////////////////////////////////////////////

(1) 派生类对象在调用其build_packet过程中,会调用build_payld这个任务;而build_payld这个任务在父类扩展的过程中被重写过;

虽然这样,最终调用的build_payld仍是父类中的build_payld,而不是子类中的build_payld.

因为默认情况下,子类中重写的方法对于父类是不可见的.

(2) 派生类对象的空间分配分为两个部分,一部分来自父类的继承部分,一部分是重写或新增的部分.默认情况下,父类的方法是无法访问派生类的重写和新增部分的。假如希望重写的方法被父类看到,就需要依靠虚方法和多态.

 【转载】systemverilog关于虚方法和多态
1.2虚方法

(1) 类中的方法可以在定义的时候通过添加virtual关键字来声明一个虚方法,虚方法是一个基本的多态性结构.

(2) 虚方法为具体的实现提供一个原型,也就是在派生类中,重写该方法的时候必须采用一致的参数和返回值.

(3) 虚方法可以重写其所有基类中的方法,然而普通的方法被重写后只能在本身及其派生类中有效。

(4) 每个类的继承关系只有一个虚方法的实现,而且是在最后一个派生类中。

【转载】systemverilog关于虚方法和多态

     【转载】systemverilog关于虚方法和多态

【转载】systemverilog关于虚方法和多态

(5) 在P1指向P2后,当P1.printA被调用的时候,程序会调用访问内存中类对象P2中P1的部分,而此时发现printA是一个普通方法,为此直接调用并结束访问;

(6) 在P1指向P2后,当P1.printB被调用的时候,程序同样找到类对象P2中P1的部分,此时发现printB是个虚方法,这时其会咨询系统,查看整个P2在定义的时候是否重写了该方法.系统发现在P2中(除了P1外),确实重写了该方法,为此,程序会直接调用P2重写的实现.

(7) 带有虚方法的类称为多态类.
————————————————
版权声明:本文为****博主「xs1326962515」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.****.net/xs1326962515/article/details/102844436