首页 > 其他分享 >SV中的关键词使用virtual,cast

SV中的关键词使用virtual,cast

时间:2023-02-06 22:45:09浏览次数:45  
标签:句柄 father SV virtual son cast inst 父类 display

virtual

SV不允许一个子类句柄指向父类对象,但是可以让一个父类句柄指向子类对象。由于父类句柄只能访问父类的成员变量和方法,不利于验证环境的复用;所以为了让继承了同一父类的子类能将一个同名方法扩展为不同功能的方法,利用类的多态,将父类中的方法声明为virtual,而指向子类对象的句柄就可以根据指向的对象类型,而不是句柄类型来调用我们希望调用的方法。

class father;
    function display();
        $display("This is Father!!);
    endfunction
endclass

class son extends father;
    function display();
        $display("This is Son!!");
    endfunction
endclass

module tb;
    father        father_inst;
    son            son_inst;

    intial begin
        son_inst    = new();
        father_inst    = son_inst; //父类句柄指向子类对象
        father_inst.display();
        son_inst.display();
    end
endmodule
View Code

结果

This is Father!!
This is Son!!

class father;
    virtual function display();
        $display("This is Father!!);
    endfunction
endclass

class son extends father;
    virtual function display();
        $display("This is Son!!");
    endfunction
endclass

module tb;
    father        father_inst;
    son            son_inst;

    intial begin
        son_inst    = new();
        father_inst    = son_inst;
        father_inst.display();
        son_inst.display();
    end
endmodule
View Code

结果

This is Son!!

This is Son!!

从上述两个代码中发现:
1)不使用virtual,父类句柄虽指向子类对象,但调用的仍是父类本身的函数
2)使用virtual,父类句柄指向子类对象,调用的是子类的函数

类似上述总结结论:

1)声明虚方法时,根据对象来决定调用
2)未声明虚方法时,根据句柄来决定调用

cast

father_inst = new();
son_inst = father_inst; //子类直接指向父类(编译报错)
$cast(son_inst,father_inst); //直接使用cast向下转换(编译报错)

正确方式

son        son1,son2;
father    father_inst;
son1 = new();
father_inst = son1;
$cast(son2,father_inst);

 

标签:句柄,father,SV,virtual,son,cast,inst,父类,display
From: https://www.cnblogs.com/Dukefish/p/17096919.html

相关文章

  • VirtualBox动态扩容/dev/mapper/centos-root(磁盘满了)
    一、添加硬盘(默认没有sdb块设备,即硬盘没有)1、进入设置页面,找到存储菜单,点击进去,添加控制器SATA:2、创建虚拟硬盘3、选择VHD虚拟硬盘,并点击下一步4、选择动态分......
  • eclipse中的SVN插件的导入和连接
    下载SVN插件(http://subclipse.tigris.org) (eclipse_svn_site..zip)进入eclipse安装目录中dropins目录并创建一个subclipse.link 的文本文件(文件名任意)内容为:path......
  • vue3引入SvgIcon
    这里使用vite-plugin-svg-icons插件yarnaddvite-plugin-svg-icons-D#ornpmivite-plugin-svg-icons-D#orpnpminstallvite-plugin-svg-icons-D在vite.con......
  • python创建virtualenv虚拟环境
    为什么要使用虚拟环境 a、隔离项目之间的第三方包依赖,如A项目依赖django1.2.5,B项目依赖django1.3。  b、为部署应用提供方便,把开发环境的虚拟环境打包到生产环境即可,不......
  • 机器学习-白板推导-系列(五)笔记:降维(PCA/SVD/PCoA/PPCA)
    文章目录0笔记说明1背景1.1样本均值1.2样本协方差矩阵2主成分分析PCA2.1最大投影方差2.2最小重构距离2.3总结3SVD分解HX4主坐标分析PCoA5概率主成分分析PPCA5.1......
  • Java下一代高并发技术——虚拟线程“JEP 425: Virtual Threads (Preview)”
    很多语言都有类似于“虚拟线程”的技术,比如Go、C#、Erlang、Lua等,他们称之为“协程”。不管是虚拟线程还是协程,他们都是轻量级线程,其目的都是为了提高并发能力。本节详细......
  • OracleVirtualBox界面太小,操作界面对用户不友好?如何使得界面最大化且方便在Windows和L
    OracleVirtualBox界面太小,操作界面对用户不友好?如何使得界面最大化且方便在Windows和Linux环境之间切换应用呢?写在前面,个人记录学习笔记。仅供参考!!!OracleVirtualBox启动Linu......
  • 使用Broadcast实现Flink流处理动态更新配置数据
    需求背景Flink实时任务的开发过程中,有一个常见的场景需要动态更新一些配置信息,这些信息可能在文件中,也可能是数据库中。对于批处理任务而言这非常简单,可我们在实时任务的......
  • SVN 安装以及初步使用(最全步骤)
    开发:大项目:Git小项目:SVNSubversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说.​​​http://subversion.apache.org/packages.html​​​windows......
  • MSVC设置版本
    MSVC设置版本在开发QT时,由于QT5.12与MSVC2017兼容,因此需要用MSVC2017来编译使用QT5.12的程序。1安装MSVC2017由于笔者电脑上安装的VisualStudio版本为VisualStu......