宁安找小姐小妹包夜上门服务 ... https://blog.eetop.cn/116762 [收藏] [复制] [分享] [RSS] 【微信:99093588】宁安找小姐上门服务【微信:99093588】宁安找小姐保健按摩服务【微信:99093588】《宁安小姐服务电话》【微信:99093588】《宁安 ...

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

OVM cookbook第二章-关于虚函数、继承和多态

已有 527 次阅读| 2013-2-2 17:44 |个人分类:验证SV/OVM/UVM

在看OVM cookbook第二章,OOP,又要理解变态的继承、多态、虚函数等概念。

百度上搜索了好几个关于多态、重载、重写的概念和定义,但是目前我的理解并没有取得统一。只有下列结论:

根据程序运行时刻的对象来调用函数,这就是多态

SV里面多态是这样的规则:如果函数加了virtual关键字,那么就是根据当前指针指向哪个类的方法就调用哪个类的;如果没加,那么就根据该指针的类型来决定调用对应类的方法。下面的例子摘自本书第二章,figure->polygon->square,每个类中draw方法加virtual,而compute_area没加,主程序定义了三种类的指针f,p,s,并且f和p都指向s,那么最后执行的结果就是:

square::draw
polygon::compute_area
square::draw
figure::compute_area
square::draw
square::compute_area

compute_area方法没加virtural,是编译时决定

draw方法加了virtual,是运行时决定,都指向s,所以调用square的方法

 

 

class figure;

  virtual function void draw();
    $display("figure::draw");
  endfunction

  function void compute_area();
    $display("figure::compute_area");
  endfunction

endclass

class polygon extends figure;

  virtual function void draw();
    $display("polygon::draw");
  endfunction

  function void compute_area();
    $display("polygon::compute_area");
  endfunction

endclass

class square extends polygon;

  virtual function void draw();
    $display("square::draw");
  endfunction

  function void compute_area();
    $display("square::compute_area");
  endfunction

endclass

program top;
  figure f;
  polygon p;
  square s;

  initial begin
    s = new();
    f = s;
    p = s;

    p.draw();
    p.compute_area();
    f.draw();
    f.compute_area();
    s.draw();
    s.compute_area();
  end
endprogram


点赞

发表评论 评论 (2 个评论)

回复 bright1224 2013-2-3 11:56
我很奇怪,如果把代码改成: program top; figure f; polygon p; square s; initial begin s = new(); f = new(); p = new(); p.draw(); p.compute_area(); f.draw(); f.compute_area(); s.draw(); s.compute_area(); end endprogram 执行的结果是: # polygon::draw # polygon::compute_area # figure::draw # figure::compute_area # square::draw # square::compute_area 那么加不加虚函数不都一样吗??
回复 bright1224 2013-2-12 11:54
自己补充一下,上帖中p/f/s分别指向对应类别的object,所以执行下来加不加virtual都一样,而教程中的例子把p/f都指向其子类square,执行的时候加了virtual的draw函数按照指向的object类型执行,没加的compute_area按照申明时候的类型执行,也就是编译时候运行。

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 3

    好友
  • 0

    获赞
  • 6

    评论
  • 470

    访问数
关闭

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

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

GMT+8, 2024-5-8 11:47 , Processed in 0.014205 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部