zoukankan      html  css  js  c++  java
  • C#中的编译时的类型与运行时的类型

    如下代码所示:

    class mm
        {
            public void F()
            {
                Console.WriteLine("mm.F()\n");
            }

            public virtual void G()        //声明了一个虚方法
            {
                Console.WriteLine("mm.G()");
            }
        }
        class nn : mm
        {
            new  public void F()         //隐藏了父类的F方法
            {
                Console.WriteLine("nn.F()\n");
            }

            public override void G()        //重写了方法G
            {
                Console.WriteLine("nn.G()");
            }
        }
        class Test
        {
            static void Main()
            {
                mm a = new mm();

                nn b = new nn();//实例化一个nn的对象b

                mm c = b; //把mm的对象c指向b

                Console.WriteLine("非虚方法");

                a.F();
                b.F();
                c.F();

                Console.WriteLine("虚方法");
                a.G();
                b.G();
                c.G();
                Console.ReadKey();
            }
        }

    以上代码中的对象b没什么好说的,运行时与编译时类型均为nn

    而对象c的运行时类型为nn,编译时类型为mm

    说说原因,因为对象b,c本身都是引用类型,在编译时对象c的类型由我们写的mm c来确定,而在程序运行后发现c引用的内容实际是b所引用的内容,而对象b的类型是确定为nn的(因已实例化了),所以c的运行时类型就和b的类型相同了。

    对于非虚方法来说,调用哪个方法取决于该实例编译时的类型

    但对于虚方法来说,调用哪个方法取决于该实例运行时的类型

  • 相关阅读:
    判断用户分辨率调用不同的CSS样式文件
    译文:创建性感的CSS
    CSS控制文字的显示与隐藏时引出的Bug
    设计规范的理想
    浏览器不兼容的源头
    图片垂直居中的使用技巧
    CSS命名规范
    5.2 微格式
    如何在本地使用 Yahoo! BrowserPlus
    如何让 Firefox 2 和 Firefox 3 版本并存
  • 原文地址:https://www.cnblogs.com/tianguook/p/1737907.html
Copyright © 2011-2022 走看看