这几个概念还真是容易混淆。
多态(polymorphism),覆盖(Override),重载(overload)
也有把override译为重载的。
关于override和overload的翻译,好像不是很统一。
更多的应该是:
覆盖(override)和重载(overload)
2。
重载(overload):
在同一个类中,出现多个同名的方法的现象就是Overload
重载事发生在同一个类中,不同方法之间的现象。
在c++或者java中,方法一般为
返回类型 方法名(参数1,参数2)
判断2个方法是不是overload,主要指方法名一样,参数不一样,
参数不一样指的是参数的个数,相同位置的参数的类型是否一样,而与参数(型参)的名称无关(参数类型/个数/顺序,不同),
与返回类型也无关。程序会根据不同的参数列来确定需要调用的函数
比如c++或者java中,这都是overload
void m1();
void m1(int arg);
void m1(int arg, char* x);
3。
多态(polymorphism)
至于多态,我还没有见过一个看一眼就能明白的定义。
有的说是允许将子类类型的指针赋值给父类类型的指针,当然java中没有指针的概念。
多态有时候也被称为动态绑定或者晚绑定或运行时绑定,意思是编译的时候不必关心,运行的时候才决定调用哪个对象的哪个方法。
我觉得多态的用途之一就是在父类提供一个接口(服务),然后调用的时候用的却是子类的具体实现。这个结合java中的interface应该是比较形象的,但是我懒得再去写几个例子了。
先来看一个java中不用interface的例子:
//java code
public class Base{
void m1(){
System.out.println("in base,m1");
}
void m2(){
System.out.println("in base,m2");
}
public static void main(String[] argv){
Base b=new Sub();
b.m1();
b.m2();
}
}
class Sub extends Base {
void m1(){
System.out.println("in sub,m1");
}
}
在main方法中b声明为Base类型,而实例化的时候是一个Sub类的实例,Sub中没有实现m2方法,所以,将调用Base的m2方法,而Sub overwirte了父类的m1方法,所以,b.m2()将调用Sub类的m1方法。
在c++中可能负杂点:
//c++ code
#include
class Base{
public:
void m1(){
cout<<"i am in base n";
}
virtual void m2(){
cout<<"i am in base ,virtual n";
}
};
class Sub:public Base{
public:
void m1(){
cout<<"i am in sub n";
}
virtual void m2(){
cout<<"i am in sub ,virtual n";
}
};
void fnm1(Base& b ){
b.m1();
}
void fnm2(Base& b ){
b.m2();
}
int main(void)
{
Sub s;
s.m1();
s.m2();
Base b;
b.m1();
b.m2();
Base* bs=new Sub();
bs->m1();
bs->m2();
delete bs;
Sub s;
fnm1(s);
fnm2(s);
return(0);
}
在c++中,需要virtual关键字(当然Sub::m2()的virtual是可以省略的)
运行结果如下:
i am in sub
i am in sub ,virtual
i am in base
i am in base ,virtual
i am in base
i am in sub ,virtual
i am in base
i am in sub ,virtual
fnm2(Base& b )中,b是一个Sub类型,如果这个方法是virtual的,则调用Sub的m2,否则,调用Base的m2。多态(polymorphism),覆盖(Override),重载(overload)
总之,多态性是面向对象的基本特性,而overload应该不算是面向对象的特性吧。
Sunday, January 6, 2008
多态(polymorphism),覆盖(Override),重载(overload)
Posted by Cammie at 9:33 PM
Labels: c++, programming
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment