如何区分重载、重写(覆盖)和隐藏

来源:互联网 发布:java完全自学手册app 编辑:程序博客网 时间:2024/06/18 16:53

重载:是指同一可访问区内(如类)被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。

示例:
class A{
public:
  void fun(int i);
  void fun(double i);//overload
  void fun(int i, double j);//overload
  void fun(double i, int j);//overload
  int fun(int i);         //错误,非重载。注意重载不关心函数返回类型。
};


隐藏:是指派生类的函数屏蔽了与其同名的基类函数(发生在不同的作用范围),注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。

重写(覆盖):是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型(注意重写的返回类型必须一样),所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰


重载和重写的区别:

(1)范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。
(2)参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。
(3)virtual的区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有

隐藏和重写,重载的区别:
(1)与重载范围不同:隐藏函数和被隐藏函数在不同类中。
(2)参数的区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定同;当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,而不是被重写(因为重写要求参数,函数名,返回值类型都必须一样)。 
示例

#include<stdlib.h>


class  A
{
public: 
void   F()  
{
printf( "A.F\n");  
}
     void   H(int x)  
{
printf( "A.H:%d\n",x); 
}
    void   G(double x)  
{
printf("A.G%d\n",x); 
}

};
class   B: public A
{
public :
void   F()  
{  
printf( "B.F\n");  
}
void   H(float x)  
{
printf( "B.H:%f\n",x);  
}
void   G(double x)  
{
printf("B.G%d\n",x); 
}
};


  void  main()  
{
B  b;
B *bb=&b;
A *a=&b; 


   a->F();
bb->F(); 


a->H(1);
bb->H(1);


a->G(2.0);
bb->G(2.0);
}


重载,必然发生在一个类中,函数名相同,参数类型或者顺序不同构成重载,与返回类型无关
 
 
重写和隐藏都发生在继承
 
重载时,根据参数选择调用的方法;

1、重写时,访问父类(一定是父类的指针指向子类对象),子类皆调用子类的重写方法;
2、隐藏时,访问父类(即使是父类的指针指向子类)则调用父类的方法,子类子类的方法。


原创粉丝点击