A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

namespace 方法重写
{
    class Program
    {
        static void Main(string[] args)
        {
            Parent p1 = new Parent();
            Parent p2 = new Child();
            p1.show();
            p2.show();
            ((Parent)p2).show();//子类方法  强制转换为父类 为什么还是子类的方法?
            Console.ReadKey();
        }
    }
    class Parent
    {
        public virtual void show()
        {
            Console.WriteLine("父类方法");
        }
    }
    class Child:Parent
    {
        public override void show()
        {
            Console.WriteLine("子类方法");
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

5 个回复

倒序浏览
楼主举例实际是实现了多态, Parent p2 = new Child();  这样写的话是new了一个子类的对象 在p2对象前加了(Parent)相当于用父类引用子类 而你new的是子类 所以调用的还是 子类重写方法 。输出("子类方法")

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
简单一句话就是“谁创建的对象,调用谁的方法”

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
举一个很容易理解的例子:

女人继承于人,楼主是女人的一个实例对象。
那我们说,楼主是不是人?难道楼主就不是女人了?这是肯定的哈! 所以从子类实例转换为父类类型,对象本身并没有改变。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
其实在Parent p2 = new Child();时就已经将这个创建的Child对象隐式转换为父类Parent了。
在这里,你用的是override, 在一条继承链上,将一个对象转换为其所属类型以下的基类,调用被override的方法,是调用override得最远的版本。
如一个子类C转换为父类P1的父类P2,对P2的某个方法,如果P1用的new来重写,那么就只能调用P2的该方法,如果P1用的override,子类C没有重写,那么就调用P1的实现,如果C中也用override重写了,就调用C中的实现。但是如果C还有子类C1,C1中也用override重写了该方法,还是只能调用C中的实现,因为这个对象本质上是C类型的而不是C1类型,除非它之前就是C1转换来的。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
Parent p1 = new Parent();
            Parent p2 = new Child();//你这里已经多态了,还用下面强转吗?
            p1.show();
            p2.show();
            ((Parent)p2).show();//多态,父类引用指向子类对象的时候,调用成员同名方法时,调用的是子类的。如果是成员变量调用的是父类的。
            Console.ReadKey();

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马