重写

override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。

重写方法的参数列表必须完全与被重写的方法的相同

void add ();

重载

overload是重载,一般是用于在一个类内实现若干重载的方法。

方法的名称相同而参数形式不同。

void add ();
void add (int a);

多态

C++中的多态性具体体现在运行和编译两个方面。

运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。

简单的说,建立一个父类的对象,它的内容可以是这个父类的,也可以是它的子类的。当子类拥有和父类同样的函数,当使用这个对象调用这个函数的时候,定义这个对象的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用。

class Triangle extends Shape {
    public int getSides() { //重写
        return 3;
    }
}
class Rectangle extends Shape {
    public int getSides(int i) { //重载
        return i;
    }
}
public class Shape {
    public boolean isSharp(){
        return true;
    }
    public int getSides(){
        return 0 ;
    }
    public int getSides(Triangle tri){
        return 3 ;
    }
    public int getSides(Rectangle rec){
        return 4 ;
    }
    public static void main(String[] args) {
        Triangle tri = new Triangle(); //继承
        System.out.println("Triangle is a type of sharp? " + tri.isSharp());
        Shape shape = new Triangle(); //多态
        System.out.println("My shape has " + shape.getSides() + " sides.");
    }
}

注意Triangle类的方法是重写,而Rectangle类的方法是重载。

继承

继承是子类使用父类的方法,而多态则是父类使用子类的方法。

使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。


多态VS重载

使用虚函数继承时,当继承类被强转成基类后调用虚函数,调用的还是继承类的虚函数。 而重载方式的继承类被强转成基类再调用重载函数,则调用的是基类的函数。

比较就可以发现多态对重载的优点:

  • 如果用重载,则在父类里要对应每一个子类都重载一个方法;
  • 如果用多态,则父类只提供取得边数的接口,至于取得哪个形状的边数,怎样取得,在子类里各自实现(重写)。


blog comments powered by Disqus

Published

16 October 2012

Tags