一个有趣的C#面试题

一次面试 做了一道题
内容如下
这道题是这样的 有四个类
public class ClassA
 
{
        
public virtual void print()
        
{
            Console.WriteLine(
"My ClassA");
        }

 }


public class ClassB:ClassA
 




public class ClassC:ClassB
 
{
        
public virtual void print()
        
{
            Console.WriteLine(
"My ClassC");
        }


 }




public class ClassD:ClassC
 
{
         
public override void print()
        
{
            Console.WriteLine(
"My ClassD");
        }

 }


调用
  ClassC Obj1=new ClassD();
            Obj1.print();

           ClassB Obj2
=new ClassD();
           Obj2.print();

            ClassA Obj3
=new ClassD();
            Obj3.print();

结果
My ClassD
My ClassB
My ClassB

前两个结果好理解

但是第三个结果
ClassA Obj3=new ClassD();
 Obj3.print();
My ClassB

为什么会这个样子 ?
翻了好多资料,
忽然想起里好几个月前曾经看过一篇文章:
<<我是谁>> http://allenlooplee.cnblogs.com/archive/2005/11/24/283578.html
于是找出来 又仔细看了一下  突然感觉自己大约可能理解了
ClassA Obj3=new ClassD();
这句代码 是声明一个受ClassA特征约束的ClassD对象 也就是说ClassA对Obj3屏蔽了除ClassA以外的特征(描述的不太准确 )
而ClassD 继承了类 C->B->A 
这样 ClassD 本身的Print方法是不会被调用的  C的也不会调用 为什么会调用B的  而不调用A的呢?
我的理解是 B的方法 重写了A的方法   也就是说 B的Print 能够通过A的特征约束.  而Obj3 是D的对象,  D又继承C, C继承B ,所以, D也具有B的特征! 调用优先级应该是从子类到基类, 也就是说D大于C C大于B B大于A,  而D 和C 都因为没有重写A的方法,肯定通不过 A的特征约束  所以  
ClassA Obj3=new ClassD();
 Obj3.print();

必定会输出
 My ClassB

不过目前 这些都是我自己个人理解   希望高手能指出我的理解错误 和不对的地方

原文地址:https://www.cnblogs.com/lzhdizhen/p/1023408.html