SV-类的继承1-2

        class是类;extends是继承,左边是子类,右边是父类继承——子类会继承父类所有的成员。       

class packet;
    integer i = 1;
    function new(int val);
        i = val + 1;
    endfuntion
    function shift();
        i = i << 1;
    endfunction
endclass

class linkedpacked extends packet; #继承
    integer i = 3;
    function new(int val);
        super.new(val);
        if(val >= 2)
            i = val;
    endfunction
    function shift();
        super.shift();
        i = i << 2;
    endfunction
endclass

module tb;
    initial begin
        packet p = new(3);
        linkedpacked lp = new(1);
        //packet tmp;
        //tmp = lp;
        $display("p.i = %0d", p.i);
        $display("lp.i = %0d", lp.i);
        p.shift();
        $display("after shift, p.i = %0d", p.i);
        lp.shift();
        $display("after shift, lp.i = %0d", lp.i);
        //$display("tmp.i = %0d", tmp.i);
    end
endmodule

        子类和父类如果出现同名的函数,若子类有super,表示子类函数shift首先执行父类的函数shift,再执行子类的内容。

        子类继承父类时,new函数的要求;对于new函数,必须要完成继承。

        这个视频的例子。——继承的例子

       父类引用指向子类对象,对象调用的方法如果已经被子类重写过了则调用的是子类中重写的方法,而不是父类中的方法;

        父类i=5,不影响子类的i的值。此处调用父类完全是因为语法的原因

        父类的i和子类的i各不影响。

        子类继承父类方法,方法名一致,参数一致。若子类要继承父类,调用super.方法即可,在子类new里都要写super.方法(new)。   子类的方法可以和父类方法相同子类的成员变量不要和父类成员变量重名

        子类句柄可赋值给父类句柄,访问的空间变小了而已。子类的句柄访问不到,可用父类句柄访问。   子类赋给父类的动作,在编译时就认为是安全的。编译时不允许的是,父类句柄赋给子类句柄;因为不知道仿真的时候,父类的句柄指向的是父类对象or子类对象。   只有在运行阶段,且父类句柄指向子类对象,那父类句柄可以赋给子类句柄——$cast(子类句柄,父类句柄)。

        总结上面就是,子类句柄可以赋值给父类句柄(但是一旦赋值给父类句柄以后,父类句柄和子类句柄在索引上查找的变量的范围就不一样了),父类句柄只能访问父类部分的区域。   如下图所示,(用lp能够找到子类的i,k和父类的m,但是找不到父类的i;若用tmp的父类句柄只能找到父类的i,m;但是找不到子类的i,k。)

 ACD

         总结,父类子类中。可以将子类句柄直接赋值给父类句柄子类可以拥有与父类同名的成员方法/变量;父类句柄只能访问父类部分的区域。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值