具体内容参加绿皮书,
virtual method

class Transaction;rand bit[31:0] src,dst,data[8];bit[31:0]crc;virtual function void calc_crc();crc=src^dst^data.xor;endfunction
endclass :Transaction    class BadTr extends Transaction;rand bit bad_crc;virtual function void calc_crc();super.calc_crc();if(bad_crc) crc = ~crc;endfunction
endclass;BadTr

使用不同类型句柄的一个代码块

Transaction tr;
BadTr       bad;initial begintr = new();tr.calc_crc(); //调用Transaction::calc_crcbad = new();bad.calc_crc();   //调用BadTr::calc_crctr = bad;          //基类句柄指向扩展类tr.calc_crc();     //调用BadTr::calc_crc
end

这里由于calc_crc定义为了virtual,所以最后一步tr.calc_crc(); 会根据对象类型调用BadTr::calc_crc,而非句柄类型调用Transaction::calc_crc。
如果没有定义为virtual calc_crc,会根据句柄类型调用Transaction::calc_crc。

BaseTr 是一个virtual class, 可被声明,可以被extend, 但是不能被实例化。
可以定义 function, virtual function,pure virtual function

pure virtual function 是只有定义,没有实体的方法,只可以在virtual class中定义。

virtual class BaseTr;static int count;int id;function new();id=count++;endfunctionpure virtual function bit compare(input BaseTr to);pure virtual function BaseTr copy(input BaseTr to=null);pure virtual function void display(input string prefix=""); endclass: BaseTr
BaseTr   BT; // 正确可以执行
BT = new(); //会报错。

pure virtual function 只有在扩展类中定义了实体,才可以使用

class Transaction extends BaseTr;rand bit[31:0] src, dst,crc, data[8];external virtual function bit compare(input BaseTr to);external virtual function BaseTr copy(input BaseTr to=null);external virtual function void copy_data(input Transaction copy);external virtual function void display(input string prefix="");external function new();endclass//下面是方法实体function bit Transaction ::compare(input BaseTr to);  Transaction tr;assert($cast(tr,to));return ( (this.src == tr.src) &&(this.dst == tr.dst) &&(this.crc == tr.crc) &&(this.data == tr.data));  );endfunction: comparefunction BaseTr Transaction ::copy(input BaseTr to=null); Transaction cp;if(to ==null) cp =new();else          $cast(cp,to);copy_data(cp);return cp;endfunctionfunction BaseTr Transaction ::copy_data(Transaction copy); copy.src = src;copy.dst = dst;copy.data = data;copy.crc = crc;endfunctionfunction void Transaction ::display(string prefix=""); $display("%s Transaction %0d src =%h, dst = %%x, crc= %x ",prefix,id,src,dst,crc);endfunctionfunction void Transaction ::new(); super.new();endfunction

纯虚类(virtual class)和纯虚方法(pure virtual function)相关推荐

  1. Pure Virtual Function

    Pure Virtual Function • If a base class has no natural implementation for a virtual function, then t ...

  2. 第十三周项目三-形状类族中的纯虚函数

    /* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月1日 *版 本 ...

  3. 静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

    1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #i ...

  4. 虚函数(Virtual Function)与 纯虚函数(Pure Virtual Function)

    1>虚函数(Virtual Function) 1.1>Base Class #ifndef Animal_h #define Animal_h #include <string&g ...

  5. pure virtual method called 纯虚函数被调用原理分析

    程序退出或者组件析构过程中常发生一类"pure virtual method called"导致的core,前几栈帧如下: 这里对该问题发生的原理做一个剖析并给出一个可复现该问题的 ...

  6. 构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。

    构造函数不可以是虚函数:析构函数可以是虚函数,也可以是纯虚函数. 一:构造函数不能声明为虚函数的原因 1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的. 而在构造 ...

  7. 虚函数必须定义(纯虚函数除外)

    1. 虚函数的声明和定义 具体关于虚函数的知识不做多讲,我在定义一个抽象类时,忘了将一个虚函数声明为 纯虚函数,又没有对其定义, 导致编译报错时报错如下: undefined reference to ...

  8. C++多继承中重写不同基类中相同原型的虚函数

    在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA  {  public:  virtual void TestA();  };  class ...

  9. 详解虚函数的实现过程之虚基类(4)

    博客虚函数实现过程3 时提到过虚基类,这里呢,我们来详细讲述一下: 当我们在虚函数的声明结尾处添加"=0",这种虚函数就被称为纯虚函数. 它好似一个没有实现只有声明的函数,它的存在 ...

最新文章

  1. MybatisPlus忽略实体类中的非数据库字段、JPA忽略实体类中的非数据库字段、HeHibernate忽略实体类中的非数据库字段
  2. php 长连接心跳_支持gRPC长链接,深度解读Nacos2.0架构设计及新模型
  3. 虚拟机用户配置root权限
  4. nignx部署Vue单页面刷新路由404问题解决
  5. Spring Cache抽象-缓存注解
  6. 如何在Python中表示一个对象
  7. 为什么做了梦第二天想不起来_元旦提醒:为什么有人睡觉爱把脚伸到被子外面?其实与身体状况有关…切勿忽视...
  8. “新内容 新交互”全球视频云创新挑战赛复赛启幕
  9. Chrome 调试动态加载的js
  10. 深度人脸表情识别研究进展
  11. (入门级小项目)JSP编程+web项目发布到Tomcat+mysql数据库
  12. linux内核文件cache机制,Linux内核文件Cache机制
  13. 浮动的三个特点很重要。
  14. maven打包失败:自定义项目工具类打包给其他微服务使用
  15. 如何刷新linux的fdisk,②linux fdisk
  16. 计算机关机快捷键是什么,win7关机快捷键是什么
  17. 不小心将项目的 iml文件删除了怎么办
  18. Windows杀死Tomcat进程
  19. OpenCV—播放AVI视频
  20. [LeetCode] 面试题 02.07. 链表相交

热门文章

  1. android5.1谷歌下载,谷歌发布Android 5.1源代码
  2. 【问题解决】Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。
  3. win10去除管理员账户密码后出现两个账号的解决方法
  4. 软件测试人员到底需不需要懂代码,我来告诉你
  5. IntelliJ IDEA配置JDK
  6. Tomcat启动闪退或者端口占用
  7. android mac 照片恢复,怎么恢复已删除的照片?苹果、安卓手机照片恢复方法
  8. 【RK356X Android11】开发之4G模块(广和通模块NL668)
  9. 政务大数据系列10:政务大数据的运营
  10. export LD_LIBRARY_PATH