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

标题: 请问大佬,为什么父类句柄不能访问子类方法和成员 [打印本页]

作者: 追乐人66    时间: 2022-5-16 20:27
标题: 请问大佬,为什么父类句柄不能访问子类方法和成员
`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
( , 下载次数: 41 )
已经进行了类型转换,父类句柄还是不能访问子类成员


作者: A1985    时间: 2022-5-17 09:44
因为声明的时候你已经是父类类型了,编译器看到的只是父类,父类不会看到子类的属性。默认是2个不同的空间,就算名字一样也是遮掩
作者: 追乐人66    时间: 2022-5-17 12:50


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


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

作者: 追乐人66    时间: 2022-5-17 12:53


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




作者: fengzhiyong123    时间: 2022-5-17 13:22


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

    ...


  • 父类句柄永远不能访问子类成员变量

    作者: 追乐人66    时间: 2022-5-17 14:05


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


    我这,刚开始将子类句柄赋值给父类句柄,然后进行cast转换,应该不会报错的啊
    作者: 追乐人66    时间: 2022-5-17 14:20


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


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

    作者: 追乐人66    时间: 2022-5-17 15:02


       
    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


    作者: 许晴125    时间: 2022-6-6 10:18
    https://www.cnblogs.com/xuqing125/p/15928599.html 想想p_sequencer为什么会引入?




    欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/) Powered by Discuz! X3.5