基本概念:多态与重载 Life is but a span.
重写
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