• Systemverilog-- OOP--对象的拷贝


    目录

     

    浅拷贝:

    定义拷贝函数:

    拷贝函数总结:


     

    浅拷贝:

    Packet p1;
    Packet p2;
    p1 = new;
    p2 = new p1;

    在创建p2对象时,将从p1拷贝其成员变量例如 interger,string和句柄等,这种拷贝方式称为浅拷贝(shallow copy)。

    定义拷贝函数:

    如果要拷贝对象,指的是首先创建一个新的对象(开辟新的空间),再将目标对象的成员变量拷贝给新对象的成员,使新对象与目标对象的成员变量数值保持一致,即完成了对象的拷贝(成员变量的拷贝)

    例如如下的代码:

    class basic_test; //父类
    ...
    virtual function void copy_data(basic_test t);
    t.def = def;
    t.fin = fin;
    endfunction
    virtual function basic_test copy();
    basic_test t = new(0);
    copy_data(t);
    return t;
    endfunction
    endclass
    class test_wr extends basic_test; //子类
    ...
    function void copy_data(basic_test t); //子类与父类的形参要相同,故 t 是父类句柄
    test_wr h; // h 是子类句柄
    super.copy_data(t); // 调用父类的copy_data()函数
    $cast(h,t); //这把父类句柄转化为子类句柄,指向子类对象
    h.def = def;
    endfunction
    function basic_test copy();
    test_wr t = new(); // t是子类句柄,指向子类对象
    copy_data(t); // copy_data里面的参数是父类句柄,这里有一个隐式转换,子类句柄转换为父类句柄,故 t 是父类句柄,指向子类对象
    return t; // 这返回的还是父类句柄
    endfunction
    endclass
    折叠

    copy_data函数: 只拷贝变量,把当前的变量def/fin, 传递给t所指的新对象的成员变量,

    copy函数:创建一个对象,然后调用copy_data()对里面的成员变量做赋值,最后返回该对象的句柄 

    拷贝函数总结:

    1)将成员拷贝函数copy_data() 和新对象生成函数copy() 分为两个方法,这样使得子类继承和方法复用较为容易。

    2)为了保证父类和子类的成员均可以完成拷贝,将拷贝方法声明为虚方法,且遵循只拷贝该类的域成员的原则,父类的成员拷贝应由父类的拷贝方法完成。

    3)在实现copy_data() 过程中,应该注意句柄的类型转换,保证转换后的句柄可以访问类成员变量

  • 相关阅读:
    第137篇 荷兰拍卖
    多线程和线程池
    Unity Quaternion接口API的常用方法解析_unity基础开发教程
    推荐一个基于Springboot + Vue 开发的前后端分离博客
    第9章Linux实操篇-组管理和权限管理
    Pytorch迁移学习训练病变分类模型
    vue通过span-method合并列之后,合并列显示在中间位置,根据鼠标滑动跟随展示
    selinux-policy-default(2:2.20231119-2)软件包内容详细介绍(1)
    【kafka】——Broker
    Numpy那些事
  • 原文地址:https://www.cnblogs.com/tianranjushi/p/16439272.html