呵呵  5裤衩终于合并成小星星  激动喜悦之后却是倍感压力啊  以后还得多多努力为避嫌  就出个关于继承的小题目  不要先复制去运行看结果  最好自己试着写一下结果
就当小练习  测测对基础是否扎实   然后写出为什么  解释好的给分哦大佬们就当路过吧    class A
    {
        public string Str = "A";        public void Show() { Console.WriteLine("Show A"); }
    }    class B : A
    {
        public string Str = "B";        public virtual void Show() { Console.WriteLine("Show B"); }
    }    class C : B
    {
        public override void Show() { Console.WriteLine("Show C"); }
    }    class D : C
    {
        public string Str = "D";        public void Show() { Console.WriteLine("Show D"); }
    }    class Program
    {
        static void Main(string[] args)
        {
            D d = new D();
            C c = d;
            B b = d;
            A a = d;
            Console.WriteLine(d.Str);
            Console.WriteLine(c.Str);
            Console.WriteLine(b.Str);
            Console.WriteLine(a.Str);
            Console.WriteLine("------------");
            d.Show();
            c.Show();
            b.Show();
            a.Show();
            Console.ReadLine();
        }
    }

解决方案 »

  1.   

    恭喜了,试一下,好久不看这种题了D
    D
    B
    A
    ------------
    Show D
    Show C
    Show B
    Show A
      

  2.   

    好像还真是挺难的。
    我觉得是下面这样的,不过不确定D
    B
    B
    A
    -------------------
    Show D
    Show C
    Show C
    Show A另外是不是会有编译错误,要求使用new来覆盖呀。
      

  3.   

    呵呵,手痒痒试了一下。不是编译错误,是警告,提示要用new先不说答案了,大家做做头脑体操。
      

  4.   

    D
    B
    B
    A
    ---------
    Show D
    Show C
    Show C
    Show A
    解释:
    1、对于str这个变量的输出,由于子类都隐藏了父类的这个变量除类C外,因此输出时都输出自身类的这个变量的值,由于C类中str是由B类继承来的,所以值是‘B',因此结果为DBBA;
    2、对于Show方法的调用与str大致差不多的情况。
      

  5.   

    DCBA 和 DBBA这两个不太确定啊,赶紧去试试~~
      

  6.   

    恭喜楼主没有复制去运行看结果,个人想的结果如下:
    D
    B
    B
    A
    ------------
    Show D
    Show C
    Show C
    Show A原因:
    1)派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不是这派生类删除了这些成员,只是不能再访问这些成员。2)类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。
    3)多态性,子类重写调用的就调用子类的方法、子类没有重写的就调用父类的虚方法。
    请指点
      

  7.   

    D 因为被覆盖了
    B 因为class c继承与class b
    B 因为class b继承与class a,而class b中有相同的变量,所以覆盖了
    A
    ------------
    show D  因为class d继承class c, 但是没有override,也就是不可重写,所以是覆盖,显示show d
    show c  因为class c继承class b, class b标注了virtual,继承此类的,此类中成员可以被重写,class c使用了override,所以重写了其父类show c  由于class b被class c重写了,所以还是这个值
    show a  这个不用解释了吧
      

  8.   

    如楼主所说,字段和方法情况略有不同
    由于类C的override对标记为virtual的父类B重写造成输出是Show C
    至于8楼所说警告是存在的,原因是继承类中对父类进行隐藏理应添加字符new,这样警告就不会有了
      

  9.   

    D
    B
    B
    A
    --------
    SHOW D
    SHOW C
    SHOW C
    SHOW A
    自己做的是这个。运行也是。虽然知道override 会对virtual重写。但是override何时重写父类virtual方法不是很清楚。望楼主或者其他高手赐教
      

  10.   

    记住,方法的创建是优先于对象存在的。这些方法是在创建在方法表内的,方法表位于内存中的Loader Heap中。
    类在加载的时候就会在Loader Heap中创建相与类关联的方法表。
    而我们的创建的实例是在GC HEap上 对象实例中有个附加成员TypeHandle指向了开始我们所说的方法表的地址,来达到关联。 
    也就是说这个方法表在内存中仅存一份,既然这样你认为何时重写呢?  
    当然是类第一次加载的时候就已经做完了   而不是什么创建实例的时候而重写
      

  11.   

    D
    D
    B
    A---------
    D
    C
    C
    A
    不知道对不对
      

  12.   

    重新复习了下,这里说的很详细
    http://blog.csdn.net/clq271520093/article/details/3960727
      

  13.   

    首先恭喜LZ,
    至于这题嘛,读了一遍,子类隐藏了父类,在C#语法中子类隐藏父类字段或者方法应该要用new,应该有警告
    直接给我的答案算了,就在方法b.Show()有点拿不准,C override了B的方法,好像和属性不大一样。
    D
    B
    B
    A
    ------------
    Show D
    Show C
    Show C
    Show A
      

  14.   

    str:变量会被重新赋值,但c中没有重新赋值,输出时只会输出继承的b中的str变量;
    show方法:方法也是一样的会被继承,b是virtual定义的虚函数,c中override重写了此函数,所以输出时b会输出c.
      

  15.   

    额,问一句啊,那个class C 继承了class B ,并重写了show(),为什么Class B的show会编程"Show C",不是很明白。
      

  16.   

    D
    D
    B
    A
    ------------
    Show D
    Show C
    Show B
    Show A好难。
    去运行看看
      

  17.   


    D d = new D();
    这句话很重要的哦  调用子类还是父类方法是取决于创建了的对象是子类还是父类!
    很明显程序中自始至终只有一个实例对象   那就是D
      

  18.   

    D
    B
    B
    A
    ------------
    Show D
    Show C
    Show C
    Show A
      

  19.   

     Console.WriteLine(d.Str);//D 
                Console.WriteLine(c.Str);//B
                Console.WriteLine(b.Str);//B
                Console.WriteLine(a.Str);//A
                Console.WriteLine("------------");
                d.Show();//show D
                c.Show();//show C  多态
                b.Show();//show C 多态
                a.Show();//show A
      

  20.   

    D
    B
    B
    A
    ------------
    Show D
    Show C
    Show C
    Show A
      

  21.   


    SHOW D
    SHOW C
    SHOW C
    SHOW A为什么是 以上结果,? 不是下面的结果,我的分析对不对?
      

  22.   

    弱弱地问一句:
    D d = new D();
    C c = d;
    B b = d;
    A a = d;
    将上面这段改成:
    D d = new D();
    C c = new C();
    B b = new B();
    A a = new A();
    效果不一样,能解释一下吗?
      

  23.   

    --------------引用 51 楼 yanele 的回复-----------------------弱弱地问一句:
    D d = new D();
    C c = d;
    B b = d;
    A a = d;
    将上面这段改成:
    D d = new D();
    C c = new C();
    B b = new B();
    A a = new A();
    效果不一样,能解释一下吗?
    --------------引用 51 楼 yanele 的回复-----------------------上面只有一个对象, 只因为,他们是继承关系,才可以用等号串接, 
      他们所指同一片内存,任何之间的操作 ,都相关!_______________________
    |                     |
    |   __________________|
    |   |     ____________|
    |   |    |   ________ |
    | A | B  | C |D     | |
    |   |    |   |———  |
    |   |    |——————|
    |   |                 |
    |   |—————————|
    |                     |
    |———————————|这样的包含关系下面的有四个对象,每个对象占用不同的内存,以上个人见解不知是否正确!
      

  24.   

    http://topic.csdn.net/u/20120211/11/0fec47bb-c8e1-4a5c-8861-cdb89fea46f4.html?58944
    大家帮忙看看吧
      

  25.   


    实例不同  内存中实例对象里的TypeHandle指针指向的Load Heap(方法表)也就截然不同
      

  26.   

    c没有给字符串赋值,并且所有的实例都是用D实例的,继承关系是先执行父类,所有c的字符串是D,show是C。
      

  27.   

    DBBA
    --
    DCCA
    少使用覆盖,用方法名区分.如果要使用请使用new明确标出
      

  28.   

    D
    B
    B
    A
    ------------
    Show D
    Show C
    Show C
    Show AC继承B的属性,所以Console.WriteLine(c.Str);输出的应该是B;
    B的Show方法是虚方法,要调用他就要去看他的实现, b.Show();的输出结果是 Show C
      

  29.   

    D
    B
    B
    A
    ----------
    Show D
    Show C
    Show C
    Show A
      

  30.   

    D
    B
    B
    A
    --------
    Show D
    Show C
    Show C
    Show A
    吧,不是很确定
    子类获得父类的非私有数据和行为。子类可以强制转换为父类。但其操作范围却被限定在父类中
     C c = d;
     B b = d;
     A a = d;
    由于C类中没有定义Str变量,故输出值是其直接父类的Str。
    所以应该是
    B
    B

    方法:
    c.Show();
    b.Show();
    a.Show();
    由于B类的方法,被C类重写(override),故输出的是Show C
    所以应该是
    Show C
    Show C
    Show A除非定义B b1=new B();b1.Show();负责不会输出Show B
    这是我的理解。呵呵。可能有不对的地方。。
      

  31.   

    D
    ""
    ""
    ""
    -------------
    Show D
    Show C
    Show C
    Show A
      

  32.   

    D
    B
    B
    A
    -------------
    Show D
    Show C
    Show C
    Show A
      

  33.   

    D
    B
    B
    A
    ---
    D
    C
    C
    A
      

  34.   

    D
    B
    B
    A
    ---------------
    D
    C
    C
    A
      

  35.   

    跟我想的一样。
    C 由于没有字段 Str,所以使用基类的,那么就显示 B。
    C 的 Show 方法覆盖了 B 的 Show 方法,所以调用 b.Show() 实际为 C 的 Show 方法,但这种覆盖不具有传递性,所以 a.show() 还是调用的 A 的 Show 方法。
    另外这个题几个地方可以加上 new。
      

  36.   

    d
    b
    b

    其中c没有str这个属性 继承父类属性了 因为重名 需要用个new吧 一般都搞方法 属性还真没试过show 方法d
    c
    c
    aC类重写了b类的show方法 所以应该都是c 
      

  37.   

    很多公司最喜欢出这号子题目了,其实就是对继承链的掌握
    virtual,new,override,sealed 在继承链中作用