我还是要主动物的例子。
dog.eat 
cat.eat
如果现在你写一个函数LetAnimalEat(An :Animal)
如果父类不能赋子类的值,那你就不得不写两个函数了。
LetDogEat(d :Dog)
LetCatEat(c: Cat)
当然这是简单说说。

解决方案 »

  1.   

    因為子类繼承自父类 ,所以父类 的介面必定也存在於子类 ㆗。
    自子类向上轉型至子类 可能會「窄化」子类其介面,但無論如何
    不會窄於父类的介面。
      

  2.   

    子类继承父类时(只讨论公有public派生),它将拥有父类的所有公有(public)接口,当你操作该变量时,只会操作到父类中的public接口,这样不违反继承的意义。如果反过来就不行了,把一个父类对象赋给子类的变量,那么该变量会拥有子类的接口,但实际的创建的是一个父类实例,当操作变量的子类接口时,并没有相应的实现,不合道理。比如说:父类是“人”,有头、手、脚等属性,有走路的动作。
    子类是“男人”、“女人”,一样有头、手、脚等属性,有走路的动作。但多出了性别特征,第一性征就不说了,如男人有胡须;而女人可以怀孕,生孩子。你可以说“男人”就“人”,“女人”是“人”,所以可以用“人”这种类型的变量来“容纳”一个“男人”或“女人”类型的实例。一个“男人”类型的变量赋给“人”类型的变量。H为一个“人”类型的变量,它可以有头、手、脚等属性,有走路的动作。如果H实际是“女人”或“男人”的实例,这也没有错。M是一个“女人”类型的变量,但它是“人”的实例,相当于一个“人”穿了女人的衣服,但它不一定是女人,当你调用它的怀孕、生孩子的方法时,它就会露馅了。总之,子类是父类的扩展,父类所拥有的,它都拥有(从外界来看,也就是public接口),所以你可以看一个子类实例看成是一个父类的。相反就不一定行。