上次说到的重载是指同一类中方法和方法之间的关系,这次向大家介绍的重写是子不同类中方法和方法的关系;在介绍重写之前,要先说说继承和多态;
继承
对象的继承代表了“is -a ”的关系,A和B可以描述成B是A,就可以称为B可以继承A,不能相互颠倒。继承者是被继承者的特殊化。在继承中,子类是派生类,父类是基类。子类不但继承父类的所有特征,还可以定义新的特征。
1、子类拥有父类非private的属性和性能,也就是说,父类中protected修饰的类成员,对子类公开,但对其他类不公开;
2、子类具有自己的属性和和功能,即子类可以扩展父类没有的属性和功能;
3、子类还可以以自己的方式实现父类的功能(方法重写);
继承的优点是:
使得所有子类公共的部分都放到了父类,使得代码得到了共享,避免了重复。
继承的缺点是:
父类变,子类不得不变。
猴子和动物的关系是继承
具体代码:
多态
继承是多态的基础,没有继承多态无意。继承是为了复用,而多态是为了在复用时解决耦合问题。下面我用不是活生生的例子给大家从概念处讲解一下。(打扰Michael Joseph Jackson老先生了)
多态:不同的对象可以执行相同的动作,但是通过她们自己的实现代码来执行。杰克逊把自己的衣服分别给自己的三个歌迷,三个歌迷穿着这件衣服里唱歌,执行唱歌的动作,虽然是用自己的方法唱,唱出来的声音不一样。
注意:
1、子类以父类的身份出现(歌迷以杰克逊的身份出现);
2、子类在工作时以自己的方法来实现(歌迷在唱歌时有自己的唱法);
3、子类以父类的身份出现时,子类特有的属性和方法不可使用(歌迷在唱时不要暴露出中文和自己的真实身份,不要说中国话)
为使子类的实例完全来自父类的类成员父类,父类必须将成员声明为虚拟的。(通过在该成员的返回类型之前添加Virtual关键字来实现。)
多态中为什么要虚拟呢?什么地方需要虚拟呢?
把歌迷与歌迷之间真正不同的地方在杰克逊类里虚拟起来,比如歌迷的唱法,歌迷唱的动作。至于杰克逊的衣服,都是一样的,穿法不变,就不必虚拟,哪个歌迷都能穿,歌迷可以直接拿过来用。用到虚拟的,就是不能直接拿过来用的,真正有区别的,要经过掩饰一下的。比如 想把中文“杰克逊”改 为“ Michael Joseph Jackson ”,只需要该一个地方就可以了。当然,这是在继承的基础上用到的多态。如果都不承认自己是杰克逊的歌迷,那就没必要穿他的衣服了,更别说再参加这次唱歌的活动了;
具体代码,见下一节:重写