多态与虚方法 — 动态行为绑定背景内容根据绿皮书第5章和第8章总结拓展核心内容多态虚函数我的理解多态Polymorphism对于多态绿皮书里只有两处提到这个词而且解释都非常抽象。在8.3.2节中首次提到OOP中多个子程序使用一个共同的名字的现象叫做“多态”。这个其实会让第一次接触这个词的人一头雾水但是实际多态也就是这句话所描述的意思当你发现一段代码里的某个方法可以在不同的场景下执行不同的任务那这个方法就是多态的。换句话说多态允许使用统一的接口基类句柄操作不同派生类的对象并自动调用对应对象的实际方法从而实现“同一接口多种行为”。多态可以分为静态和动态。静态多态通过参数化类在编译时确定类型。在[[SV基础之面向对象编程基础四]]中介绍动态多态通过virtual方法在运行时根据对象实际类型决定调用哪个方法。virtual方法的使用在基类中声明方法为virtual表示该方法可以在派生类中被重写并且通过基类句柄调用时会动态绑定到实际对象的实现。class Base; virtual function void show(); $display(Base show); endfunction endclass class Derived extends Base; virtual function void show(); $display(Derived show); endfunction endclass module test; Base b; Derived d new(); b d; // 基类句柄指向派生类对象 b.show(); // 输出 Derived show运行时多态 endmodule若去掉virtual则b.show()会调用Base::show()即静态绑定。纯虚方法强制派生类必须实现该方法。纯虚方法在[[SV基础之面向对象编程基础四]]中介绍多态的应用场景第一次了解多态的时候我第一反应是觉得多态会导致混淆如果一个方法可以指向多个行为那每次执行这个方法的时候需要花很多时间去理解这个方法究竟执行的是什么行为。但是后来我逐渐理解了多态是一种高度的抽象概括是为了让顶层调用者忽略这个方法的执行细节多态的存在让本来无限扩大的需求变得统一。用网络梗举个例子人类科技的发展本质就是烧开水和扔石头。“烧开水”和“扔石头”就可以理解为多态你不用去管究竟是用柴火烧开水还是核能烧开水不用管是投石机扔石头还是用火药发射石头反正本质就是烧开水和扔石头。在验证中的应用场景也是非常广泛测试平台组件替换例如用不同风格的驱动器Driver替换基类句柄指向的对象。工厂模式UVM 中根据配置创建不同类型的组件实例。回调Callback在特定钩子函数中插入定制行为。