C#中的多态性。基类';s方法被调用,但为什么?

C#中的多态性。基类';s方法被调用,但为什么?,c#,inheritance,polymorphism,overriding,virtual,C#,Inheritance,Polymorphism,Overriding,Virtual,我读到的大多数关于继承层次结构中方法多态性的文章都没有提供发生这种情况的原因。有人能提供以下行为的原因或类比吗 Class A{ public void Print(){ Console.WriteLine("A.Print"); } } Class B : A{ public void Print(){ Console.WriteLine("B.Print"); } } Class Test{ public static

我读到的大多数关于继承层次结构中方法多态性的文章都没有提供发生这种情况的原因。有人能提供以下行为的原因或类比吗

Class A{
    public void Print(){
        Console.WriteLine("A.Print");
    }
}

Class B : A{
    public void Print(){
        Console.WriteLine("B.Print");
    }
}

Class Test{
   public static void Main(string[] args){
         A a = new B();
         a.Print();  // Prints "A.Print"
    }
}

测试类中的代码打印“A.Print”,但是为什么呢?

在类测试中,您定义了类型A的实例 因此调用了类A定义中的Print方法

这一切都与铸造有关,也许这是有用的


您创建了一个B的实例,比如说“更大”,但变量“a”被转换为“更小”的类a,并包含方法print a。您执行了与以下类似的操作:

A:I类 B:I类

接口公开了A和B中的某些方法,要触发它,请使用:

A.印刷品 (i类)B.打印

这里也一样:


简单地说。B包含类A。因此您可以使用A=新B();启动了B类,但同时将其提取(转换)为类。

将基类方法虚拟化,并在派生类方法中使用override关键字。

console.printline()
,很好。感谢Toumash提供的好代码。主持人,请删除这个问题的重复标签。我相信新的标题正是针对这个没有明确提问或回答的主题。。谢谢我相信这是我想要的(特别是最后一段),或者是我进一步阅读后理解的。。谢谢大家。通过隐式转换,我会总结或假设——当我将派生类的实例分配给其基类类型的对象时,派生类的实例(隐式)类型转换为基类类型的对象。我也能够保证这一点——当我将鼠标悬停在隐式类型转换对象的成员上时,它显示为基类的成员
谢谢,我把你的奶酪作为答案,因为它很好地解释了我是如何理解这一点的
谢谢大家!