在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3676|回复: 7

[求助] sv父类子类句柄赋值问题

[复制链接]
发表于 2018-7-17 20:51:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
program class3;

class base;

int a=1;

endclass


class sub extends base;

int a = 2;

endclass


initial

begin

base b;

sub  s1;

sub  s2;



s1 = new;

b = s1;

$display("%d",s1.a);

$display("%d",b.a);




s1.a = 3;

s2 = s1;

$display("%d",s1.a);

$display("%d",s2.a);


end

endprogram

如上代码:s2和s1指向同一片内存空间,所以s1.a和s2.a的值相等的。
b和s1也是指向相同的内存空间吗?如果是,那么s1.a和b.a为什么不相等呢?如果不是,那b=s1又是什么意思呢?
发表于 2018-7-18 15:10:37 | 显示全部楼层
SV中OOP那里讲的,再看看教材吧;
发表于 2018-7-24 19:59:58 | 显示全部楼层
本帖最后由 方大囧 于 2018-7-25 21:27 编辑

《SystemVerilog验证—测试平台编写指南》第8.3.2节虚方法里有讲到:“当需要决定调用哪个虚方法的时候,SystemVerilog根据对象的类型,而非句柄的类型来决定调用什么方法”,也就是说,当类的方法没有声明为虚方法时,SV根据句柄的类型来决定调用什么方法,这里b=s1,虽然b指向了sub类,但是类里并没有声明虚方法,而且b是个base类句柄,所以SV根据b的句柄类型调用的是base类中的a=1,所以s1.a=2和b.a=1不相等。【如有错误,欢迎指正】
发表于 2018-7-25 09:13:37 | 显示全部楼层
你在子类又把a声明了一次,已经和父类的a不是一个了。
发表于 2018-7-25 09:24:28 | 显示全部楼层
说下我的理解,b=s1,是将基类句柄b指向s1的对象。测试中的参数都采用int,是会出现b.a仍然调用基类的参数。如果在每个类中写一个virtual print();打印出各自类中a 的值,应该会达到楼主想要的效果。
发表于 2018-7-25 19:54:35 | 显示全部楼层
跟虚函数没关系,sub里面的a和base里面的a没有任何关系,虽然名字一样。在sub中加一个print函数,打印a和super.a,你会发现二者的值是不一样的。b因为是base句柄,所以只能访问base里面的a,而s1中的a是sub里面的值。
发表于 2018-7-31 09:39:17 | 显示全部楼层
感觉二楼解释的很有道理啊
发表于 2019-1-31 02:18:50 | 显示全部楼层
学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-9-22 10:01 , Processed in 0.020296 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表