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

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

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1783|回复: 8

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

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

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

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

x
`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为什么会引入?
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

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

    GMT+8, 2025-4-21 21:38 , Processed in 0.025078 second(s), 8 queries , Gzip On, MemCached On.

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