定义Animal为父类,Dog为Animal的子类
那么下面有三种情况
Dog dog=new Dog();
Animal animal=new Animal();
Animal abc=new Dog();
那么这三者之间有什么差异?
abc在这里等同与dog还是animal?
或者是加强版的animal还是阉割版的dog?
他的权限跟dog相同还是animal相同?

解决方案 »

  1.   

    子类与父类的关系, 子类可以替代父类,父类不能替代子类, 这个原则貌似 叫里氏置换原则. 
    三者的差异
    animal 是父类.abc等同于dog,理论上说父类与子类的关系, 子类可以替换父类.就是当使用animal这个对象的时候, 它的方法, 属性可以被dog或者abc子类的方法,属性来代替.
    换句话说 dog跟abc 是animal的加强版.
      

  2.   

    1Animal animal=new Animal(); //访问不到Dog中的public属性
    2Dog dog=new Dog();   //这个自然可以
    3Animal abc=new Dog(); //这个也访问不到Dog中的Public属性你动手写一下这几个类,你就明白的很
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication35
    {
        class Animal
        {
          public     int i = 0;
             int j = 0;
           
        }
    }using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication35
    {
         class Dog:Animal
        {
             public int k= 9;         public string ReturName()
             {
                 return "你好";
               
             }
        }
    }using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication35
    {
        class Program
        {
            static void Main(string[] args)
            {
                Animal al = new Dog();
                Animal a = new Animal();
                Dog dog = new Dog();
                
            }
        }
    }
    我给你写好好算了,你去调用一下就知道了
      

  3.   

    namespace 继承
    {
        public abstract class Animal
        {
            public abstract void ShowType();
            public void Eat()
            {
                Console.WriteLine("Animal always eat.");
            }
        }    public class Bird:Animal
        {
            private string type = "Bird";
            public override void ShowType()
            {
                Console.WriteLine("Type is {0},Bird类的调用",type);
            }
            private string color;
            public string Color
            {
                get { return color; }
                set { color = value; }
            }
        }    public class Chicken : Bird
        {
            private string type = "Chicken";
            public override void ShowType()
            {
                Console.WriteLine("Type is {0},Chicken类的调用",type);
            }
        }
    }
    这个是我写的,如果我把Chicken的override去掉的话那么输出的是Bird,否则的话是Chicken!
    个人感觉这里的abc应该是加强版的Animal,而不是阉割版的Dog,毕竟abc是Animal类型的,不知道对不对,还有就是权限的问题,这里的abc的权限跟谁的有关?
      

  4.   

    Animal abc = new Dog();这个abc等同于 Dog dog = new Dog(); 的dog其实之前实例化abc的时候 abc具有的属性和方法就和dog一样了 因为声名时用的是new Dog()abc和dog一样 都可以访问父类(Animal)的非私有的属性和方法也同样可以复写父类的虚方法
      

  5.   

    Animal al = new Dog();
    Animal a = new Animal();这两个表面上看不一样,其实差不多,根本访问不到Dog中的东西
     Dog dog = new Dog();这个是最终版,上可访问父类,下可访问自己
      

  6.   

    abc与dog 对象是一样的. 没有差异. 
    dog类是在animal类继承的. 也就是说, 功能要比父类多,所以abc对象是animal对象的加强版. 如此是否清楚一点?
      

  7.   

    这么说吧 abc是Dog类型的 与dog一摸一样abc的权限 相当于dog的权限可以访问父类的非private成员 复写虚函数Animal abc = new Dog();
    Dog abc = new Dog();这两条语句是等价的LZ明白否?
      

  8.   

    用基类定义一个对象,用派生类实例化这个对象时,
    如果使用new隐藏基类虚方法时(加vitual就是虚方法),这个对象调用被隐藏的方法时,结果只执行基类方法;
    如果使用override重载基类非虚方法时,调用被重载的方法,基类和派生类中的方法都执行。
    非虚方法只能重载,虚方法只能隐藏。
      

  9.   


    这两者绝对不是等价的,我已经代码验证过了,子类中的一些方法父类怎么可能调用?
    比如Animal里定义一个Eat()的方法
    Dog继承并重写,然后重新定义一个Color()
    那么Animal abc=new Dog();
    这时的abc.Eat()是有的,并且跟Dog重写后的一样
    但是abc.Cololr()是不存在的
      

  10.   


    对的,但如果父类的方法在子类被重写,a1就按照子类的方法进行构造,所以说a1是a的加强版
      

  11.   

    什么加强版阉割版,哪来什么权限之说...dog实例和abc实例是完全相同的,唯一不同的是它们各自具有不同的类型,也就是说只有引用不同实例是相同的...而animal实例和前两者没有直接关系,只有类型上的联系...不要说什么“子类的方法父类不能调用所以dog对象和abc对象不同”的外行话...比如你是个人类,可现在不知道你是男人还是女人,所以不能调用你的属于男人或女人的方法,但这不能改变你是个确定的男人类或女人类的实例,和其它男人类或女人类的实例没有不同...除非你是春哥或曾哥...