c++中,重载,重定义,重写 的区别

一:重载

在一个类中,函数名相同,参数列表不同(具体表现为参数个数或参数类型不同),至于返回型可同可不同。重载属于静态多态,而不是通过继承和虚函数实现的动态多态。编译器会根据这些函数的参数列表的不同,将同名的函数名称做修饰,从而生成不同名称的预处理函数。

eg:

double  max(double x,double y),

int  max(int  x,int y);

这两个函数就是重载的范例,那么调用的时候编译器是如何确定调用哪一个勒?书本上一般说程序会根据参数类型识别调用哪一个,其实那是忽悠人的。实际上在编译期间,编译器就已经把函数名字改变了,多加了一些后缀而已(当然说自动识别也不为过)。

二:重定义

也叫覆盖,主要发生在不同的类且存在继承关系,子类重新定义父类中有相同名称相同参数的虚函数(virtual),“重写”基类方法就是修改它的实现或者说在派生类中重新编写。真正意义上实现了多态。

重写需要注意:

1 被重写的函数不能是static的。必须是virtual的

2 重写函数必须有相同的类型,名称和参数列表

3 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public,protected也是可以的

三:重定义

也叫隐藏,子类重新定义父类中有相同名称的非虚函数,参数列表可以相同也可以不同,会隐藏其父类的实现方法。

综上所述,总结如下:

1 成员函数重载特征:
   a 相同的范围(在同一个类中)

   b 函数名字相同

   c 参数不同

   d virtual关键字可有可无

2 重写(覆盖)是指派生类函数覆盖基类函数,特征是:

   a 不同的范围,分别位于基类和派生类中

   b 函数的名字相同

   c 参数相同

   d 基类函数必须有virtual关键字

3 重定义(隐藏)是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

   a 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。

   b 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。

 

注意区分虚函数中的重载和重写:

class A{
public:
      virtual int fun(){}
};

class B:public A{
       int fun(int a){}  //这是重载而不是重写:
}
int mian()
{

}
class B:public A{
       int fun() // 从A继承来的 fun, 编译器会自己偷偷帮你加上
       int fun(int a){} // 新的fun, 和前面的只是名字一样的重载函数, 不是虚函数
}

你可能感兴趣的:(c++中,重载,重定义,重写 的区别)