纯虚类(virtual class)和纯虚方法(pure virtual function)
具体内容参加绿皮书,
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)相关推荐
- Pure Virtual Function
Pure Virtual Function • If a base class has no natural implementation for a virtual function, then t ...
- 第十三周项目三-形状类族中的纯虚函数
/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月1日 *版 本 ...
- 静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数
1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #i ...
- 虚函数(Virtual Function)与 纯虚函数(Pure Virtual Function)
1>虚函数(Virtual Function) 1.1>Base Class #ifndef Animal_h #define Animal_h #include <string&g ...
- pure virtual method called 纯虚函数被调用原理分析
程序退出或者组件析构过程中常发生一类"pure virtual method called"导致的core,前几栈帧如下: 这里对该问题发生的原理做一个剖析并给出一个可复现该问题的 ...
- 构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。
构造函数不可以是虚函数:析构函数可以是虚函数,也可以是纯虚函数. 一:构造函数不能声明为虚函数的原因 1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的. 而在构造 ...
- 虚函数必须定义(纯虚函数除外)
1. 虚函数的声明和定义 具体关于虚函数的知识不做多讲,我在定义一个抽象类时,忘了将一个虚函数声明为 纯虚函数,又没有对其定义, 导致编译报错时报错如下: undefined reference to ...
- C++多继承中重写不同基类中相同原型的虚函数
在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: virtual void TestA(); }; class ...
- 详解虚函数的实现过程之虚基类(4)
博客虚函数实现过程3 时提到过虚基类,这里呢,我们来详细讲述一下: 当我们在虚函数的声明结尾处添加"=0",这种虚函数就被称为纯虚函数. 它好似一个没有实现只有声明的函数,它的存在 ...
最新文章
- MybatisPlus忽略实体类中的非数据库字段、JPA忽略实体类中的非数据库字段、HeHibernate忽略实体类中的非数据库字段
- php 长连接心跳_支持gRPC长链接,深度解读Nacos2.0架构设计及新模型
- 虚拟机用户配置root权限
- nignx部署Vue单页面刷新路由404问题解决
- Spring Cache抽象-缓存注解
- 如何在Python中表示一个对象
- 为什么做了梦第二天想不起来_元旦提醒:为什么有人睡觉爱把脚伸到被子外面?其实与身体状况有关…切勿忽视...
- “新内容 新交互”全球视频云创新挑战赛复赛启幕
- Chrome 调试动态加载的js
- 深度人脸表情识别研究进展
- (入门级小项目)JSP编程+web项目发布到Tomcat+mysql数据库
- linux内核文件cache机制,Linux内核文件Cache机制
- 浮动的三个特点很重要。
- maven打包失败:自定义项目工具类打包给其他微服务使用
- 如何刷新linux的fdisk,②linux fdisk
- 计算机关机快捷键是什么,win7关机快捷键是什么
- 不小心将项目的 iml文件删除了怎么办
- Windows杀死Tomcat进程
- OpenCV—播放AVI视频
- [LeetCode] 面试题 02.07. 链表相交
热门文章
- android5.1谷歌下载,谷歌发布Android 5.1源代码
- 【问题解决】Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。
- win10去除管理员账户密码后出现两个账号的解决方法
- 软件测试人员到底需不需要懂代码,我来告诉你
- IntelliJ IDEA配置JDK
- Tomcat启动闪退或者端口占用
- android mac 照片恢复,怎么恢复已删除的照片?苹果、安卓手机照片恢复方法
- 【RK356X Android11】开发之4G模块(广和通模块NL668)
- 政务大数据系列10:政务大数据的运营
- export LD_LIBRARY_PATH