当前位置:编程学习 > C#/ASP.NET >>

类的多态实现(虚方法)咨询

    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            A a = b;
            a.F();
            b.F();
            a.G();
            b.G();
            Console.ReadKey();
        }
    }
    class A
    {
        public void F()
        {
            Console.WriteLine("A的F");
        }
        public virtual void G()
        {
            Console.WriteLine("A的G");
        }
    }
    class B : A
    {
        new public void F()
        {
            Console.WriteLine("B的F");
        }
        public override void G()
        {
            Console.WriteLine("B的G");
        }
    }

这段代码中A a=b是将b变量的地址给a吗?如果是的话a.F()应该输出"B的F",但是输出的是"A的F",这个地方我有些不懂了,哪位高手能给解释一下这个 A a=b是啥意思? --------------------编程问答-------------------- 一个是 new public void F() ,一个是 public override void G()
new 的意思是在当前类型中掩盖掉父类同名同参的方法,相当于套牌或冒名顶替,对父类没有影响,但是当类型转为父类时,就调用的是父类原本的方法了,而 override 是直接将父类中的方法替换成自己的,所以即使类型转换为父类,内容依然是自己的,当然要求也更高,要求父类方法带有 virtual 修饰。 --------------------编程问答-------------------- A a=b 是不是直接将b的引用地址直接赋给了a呢?就是a指向了b,那a.F()就应该等同于b.F(),那应该是调用 Console.WriteLine("B的F");这个呀?我还是没弄明白!转不过这个弯! --------------------编程问答--------------------
引用 2 楼  的回复:
A a=b 是不是直接将b的引用地址直接赋给了a呢?就是a指向了b,那a.F()就应该等同于b.F(),那应该是调用 Console.WriteLine("B的F");这个呀?我还是没弄明白!转不过这个弯!

A a=b 是将 b 的地址给了 a,执行时是不会也不可能去管那个数据的实际类型的,代码指定什么就是什么,如果是虚方法,会有个虚方法表,指定类型对应该调用的方法,调用方法时,如果是虚方法,就去查虚方法表找到代码指定类型对应的方法,如果不是虚的,就直接调用,当转成 A 后,F 不是虚方法,就直接执行 A 自己的 F 了。 --------------------编程问答-------------------- 你就记住new这种写法和继承、多态没有关系,虽然能编译,但是可能你一年到头也用不到,就无视它好了。

只要记住virtual/override一种就行了。 --------------------编程问答--------------------    new public void F()这种是子类把父类的方法用一个同名的函数给隐藏了。因此调用的不是同一个方法 --------------------编程问答-------------------- 似懂非懂 --------------------编程问答-------------------- 你要理解多态走的过程
1,实例化,构造函数,就不说了

执行a.F();
先到A下面看 是否有F()
有就直接执行--
如果是虚方法,就去B看看是否有覆盖方法,有就执行B的F()
如果B没有覆盖,则返回执行A的F();

你要理解这个过程,包括A a=new B(); 构造函数是怎么走的,静态构造函数怎么走的……
认真理解C#语法
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,