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

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜帖子
查看: 2060|回复: 8

[求助] 请问大佬,为什么父类句柄不能访问子类方法和成员

[复制链接]
发表于 2022-5-16 20:27:46 | 显示全部楼层 |阅读模式

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

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

×
`timescale 1ns/1ns


class parent;
        int A;
        function void printf();
                $display("hello word");
        endfunction
        function new();
        endfunction
endclass

class child extends parent;
        int B;
        function new();
        endfunction
        virtual function void cprintf();
                $display("I'm child,hello word");
        endfunction
endclass


module ptest;
        parent a;
        child b;
        initial begin
            //a = new();
                b = new();
                a = b;
                a.printf();
                //a.cprintf();
                //
                $cast(b,a);
                a.cprintf();
        end
endmodule
image.png
已经进行了类型转换,父类句柄还是不能访问子类成员

发表于 2022-5-17 09:44:10 | 显示全部楼层
因为声明的时候你已经是父类类型了,编译器看到的只是父类,父类不会看到子类的属性。默认是2个不同的空间,就算名字一样也是遮掩
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-17 12:50:47 | 显示全部楼层


   
A1985 发表于 2022-5-17 09:44
因为声明的时候你已经是父类类型了,编译器看到的只是父类,父类不会看到子类的属性。默认是2个不同的空间 ...


cast将父类转换为子类,这不就是sequence访问sequencer的变量也是这样实现的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-17 12:53:15 | 显示全部楼层


   
A1985 发表于 2022-5-17 09:44
因为声明的时候你已经是父类类型了,编译器看到的只是父类,父类不会看到子类的属性。默认是2个不同的空间 ...


  • 父类句柄转成子类句柄的原因是要访问子类的成员变量。请问大佬咋实现,为什么我这样写编译不通过

回复 支持 反对

使用道具 举报

发表于 2022-5-17 13:22:19 | 显示全部楼层


   
追乐人66 发表于 2022-5-17 12:53
  • 父类句柄转成子类句柄的原因是要访问子类的成员变量。请问大佬咋实现,为什么我这样写编译不通过

    ...


  • 父类句柄永远不能访问子类成员变量
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2022-5-17 14:05:04 | 显示全部楼层


       
    fengzhiyong123 发表于 2022-5-17 13:22
    父类句柄永远不能访问子类成员变量


    我这,刚开始将子类句柄赋值给父类句柄,然后进行cast转换,应该不会报错的啊
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2022-5-17 14:20:33 | 显示全部楼层


       
    fengzhiyong123 发表于 2022-5-17 13:22
    父类句柄永远不能访问子类成员变量


    只能访问跟父类相同的子类成员和方法,有利于多态性。应该这样理解。
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2022-5-17 15:02:28 | 显示全部楼层


       
    fengzhiyong123 发表于 2022-5-17 13:22
    父类句柄永远不能访问子类成员变量


    `timescale 1ns/1ns


    class parent;
            int A = 2;
            virtual function void cprintf();
                    $display("hello word");
            endfunction
            function new();
            endfunction
    endclass

    class child extends parent;
            int B = 4;
            function new();
            endfunction
             function void cprintf();
                    $display("I'm child,hello word");
            endfunction
    endclass


    module ptest;
            parent a;
            child b,b1;
            initial begin
                   
                    b = new(); //子类对象
                    a=b;
                    $display("child A = %d",b1.B);
                    void'($cast(b1,a));
           
                    $display("child A = %d",b1.B);
            end
    endmodule
    懂了,谢谢大佬,明白了cast

    回复 支持 反对

    使用道具 举报

    发表于 2022-6-6 10:18:58 | 显示全部楼层
    https://www.cnblogs.com/xuqing125/p/15928599.html 想想p_sequencer为什么会引入?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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


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

    GMT+8, 2025-9-10 05:20 , Processed in 0.018871 second(s), 5 queries , Gzip On, Redis On.

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