类B继承了类A, 当使用 A a = new B() 此语句创建出的对象a到底是什么类型,(我用gettype返回的是类B的类型,但为什么不能调用B的方法?).它在内存中如何分配的空间,分配的空间和B用 B b = new B() 创建的实例b一样吗?请高手解释一下.

解决方案 »

  1.   

    A a = new B();
    此时,new B() ==>已经变转换为 A的接口,所以调用不到其子对像B的方法。
      

  2.   

    A a = new B() 这里在后台其实做了一个类型转换已经把B类的对象转换成A类的对象了所以你调用不到B类的方法想了解这方面的东西,你可以看看C#高级编程第三版,其中有详细介绍自定义类型转换的内容.
    就内存分配而言它和B b = new B()没什么区别,都是在堆栈上分配一个声明b,在堆上创建一个B类的对象然后把地址返回给b. 
      

  3.   

    是的,如果B实现了Iksl的接口,而你Iksl ksl = new B 那么你就可以用ksl调用B的方法了,当然这是另外的问题了
      

  4.   

    你封箱了,所以只能调用封箱后对象类型的方法.
    所有A的派生类都可以封箱成A的并不只是B一个.
      

  5.   

    A a = new B();
    此时,new B() ==>已经变转换为 A的接口,所以调用不到其子对像B的方法。
    可以在转换回来:
    B b = (B)a;
    然后就可以正常调用B的方法了。