大家好,关于继承有点不明白。
如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication45
{
    class Program
    {
        static void Main(string[] args)
        {
            A a;
            B b = new B();
            a = b;
            a.abc();//调用的是类A中的方法
            b.abc();//调用的是类B中的方法
            a.kkk();//调用的是类B中的方法
            b.kkk();//调用的是类B中的方法
            Console.WriteLine(a.a);//应输出0
            Console.WriteLine(b.a);//应输出1                   我在看书的时候,可以是我理解有问题,还是我的软件有问题,两者不一致,所以我想让大家帮我确认一下这几个注释对吗?
            Console.WriteLine(a.b);//此处错误,因为a并不含有b的定义。
        }    }
    class A
    {
        public int a = 0;
        public void abc()
        { }
        public virtual void kkk()
        { }    }
    class B:A
    {
        public int a = 1;
        public int b = 9;
        public void abc()
        { }
        public override void kkk()
        {  }    }
}
//
//我的理解是用父类来引用子类对象,比如a=b,那此时a与直接实例化A的区别在于a中的虚方法变成了b中的方法,但是,a 中并不能引用B中与A不同的成员,
//是这样吗?  我的软件输出的结果是和我的想法是一样的,但好像和书上说的不一样。请大家确认。

解决方案 »

  1.   

    以真实输出为准。另外好像标红的地方应该提示错误,要使用new来覆盖父类的声明吧。class B:A
      {
      public int a = 1;
      public int b = 9;
      public void abc()
      { }

      public override void kkk()
      { }  }
      

  2.   

    a 中并不能引用B中与A不同的成员,这个说法不准确。B从A继承,所以B类型也是A类型,当然它本身同时也是B类型。
    当你把B的实例传递给A类型引用的时候,你告诉编译器,我把B当作A来用(事实上逆变类型存在一个隐式的类型转换)。当然A没有的就不能用了。
    但是你可以使用一个显式的类型转换来使用B的自有方法。
    B a1 = (B)a as B;
      

  3.   

    MSDN解释,大多数情况下,MSDN会解释的很清楚。public class A
    {
        public A() { }
    }public class B : A
    {
        public B() { }
    }新类(即派生类)将获取基类的所有非私有数据和行为以及新类为自己定义的所有其他数据或行为。因此,新类具有两个有效类型:新类的类型和它继承的类的类型。在上面的示例中,类 B 既是有效的 B,又是有效的 A。访问 B 对象时,可以使用强制转换操作将其转换为 A 对象。强制转换不会更改 B 对象,但您的 B 对象视图将限制为 A 的数据和行为。将 B 强制转换为 A 后,可以将该 A 重新强制转换为 B。并非 A 的所有实例都可强制转换为 B,只有实际上是 B 的实例的那些实例才可以强制转换为 B。如果将类 B 作为 B 类型访问,则可以同时获得类 A 和类 B 的数据和行为。对象可以表示多个类型的能力称为多态性。