函数重载和覆盖(重写)的区别

1、重载:函数重载是指在同一作用域内(名字空间),可以有一组具有相同函数名,不同参数列表的函数;

2、覆盖(也叫重写):指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样;

3、隐藏:指派生类中的函数把基类中相同名字的函数屏蔽掉了,隐藏与另外两个概念表面上看来很像,很难区分,其实他们的关键区别就是在多态的实现上。

下面那种情形下myfunc函数声明是重载?
A. namespace IBM
{
    int myfunc(int a);
}
namespace SUN
{
    int myfunc(double b);
}
B. namespace IBM
{
    int myfunc(int a);
}
namespace SUN
{
    using IBM::myfunc;
    int myfunc(double b);
}
C. namespace IBM
{
    int myfunc(int a);
    namespace SUN
    {
        int myfunc(double b);
    }
}
D. class A
{
public:
    int myfunc(int a);
}
class SubA: public A
{
public:
    int myfunc(double b);
}

答案是B,A和C都是名字空间不同;D是隐藏,只有B是重载!

存在如下声明:
void f (); //全局函数
class A
{
public:
 void f(int);
};

class B: public A
{
public:
 void f(int *);
 static void f(int **);
 void test();
 //...
};

那么在如下B::test实现中哪几个函数调用是合法的:
void B::test()
{
 int x = 0;
 int *p = NULL;
 f();    //(1)
 f(x);   //(2)
 f(&x);  //(3)
 f(&p);  //(4)
};
A.(1)(2)(3)(4) B.(1)(3)(4) C.(2)(3)(4) D.(3)(4)

答案是D,类成员函数重载:局部同名函数将隐藏而不是重载全局声明,不引入父类名字空间时子类的同名函数不会和父类的构成重载,静态成员函数可以和非静态成员函数构成重载。

时间: 2024-08-04 21:06:32

函数重载和覆盖(重写)的区别的相关文章

C++:类成员函数的重载、覆盖和隐藏区别?

#include <iostream> class A { public: void func() { std::cout << "Hello" << std::endl; } void func(int k) { } }; class B : public A { public: using A::func; // 把这句注释掉试试,嘿嘿 void func(int i) { } }; int main() { B b; b.func();//编译

类成员函数的重载、覆盖和隐藏区别 (C++)

这是本人第一次写博客,主要是想记录自己的学习过程.心得体会,一是可以方便以后回顾相关知识,二是可以与大家相互学习交流. 关于C++中类成员函数的重载.覆盖和隐藏区别,第一次看到这个问题是在准备找工作的时候在牛客网中(http://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95)看到的,后来也有遇到一些题在考察这个知识点,只要理解了他们的区别,还是可以正确的解答有关这个知识点的题.看到牛客网中有大牛的解释很好,故

【转】C++函数的重载、覆盖和隐藏区别

网上看到的关于C++函数的重载.覆盖和隐藏区别的回答,如下(其内容来源于C++面试宝典中一道题目): a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类):(2)函数名字相同:(3)参数相同:(4)基类函数必须有virtual 关键字. c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:(1)如果派生类的函数与基类的函

类中的同名函数关系,重载,覆盖/重写,隐藏

对于类中的同名函数,重载,覆盖/重写,隐藏 C++特性,不是类亦可以实现重载,与virtual无关联.重载:同一类域抑或无类域,相同函数名,不同形参个数或类型:由形参决定调用哪个函数实现.同类域同名函数相同形参会引起编译错误. virtual修饰函数需要相同的返回值与形参类型,多态特性则需要该修饰符才能体现. 重写/覆盖:基类与派生类关系,同样的函数名,相同形参个数与类型,基类函数有virtual修饰:派生类执行派生类函数而不是基类函数实现,指针与引用的多态体现出来了,即基类指针或引用可根据指向

面向过程和面向对象的区别,方法重载和方法重写的区别

先有面向过程,而后退出面向对象 面向过程和面向对象两者都是软件开发思想,先有面向过程,后有面向对象.在大型项目中,针对面向过程的不足推出了面向对象开发思想. 打个比方 蒋介石和毛主席分别是面向过程和面向对象的杰出代表,这样充分说明,在解决复制问题时,面向对象有更大的优越性. 面向过程是蛋炒饭,面向对象是盖浇饭.盖浇饭的好处就是"菜""饭"分离,从而提高了制作盖浇饭的灵活性.饭不满意就换饭,菜不满意换菜.用软件工程的专业术语就是"可维护性"比较好,

函数重载、覆盖、多态

#include <iostream> using namespace std; /* *对于纯虚函数可以实现也可以不实现,但派生类一定要覆盖基类的纯虚函数.否则派生类仍然是抽象类 * *如果派生类覆盖基类的虚函数,则基类的指针或引用实际指向子类对象,那么通过该指针或引用调用虚函数时,将调用子类的虚函数;如果不是虚函数,则调用父类的函数. * */ class PEOPLE { public: int age; //派生类必须实现抽象类的纯虚函数,否则派生类仍然是抽象类 virtual voi

JAVA基础之重载,覆盖/重写,多态

重载发生在同一个类中 特点是两同一不同,类相同,方法名相同,参数不同.其他项与重载无关. 在调用方法的时候,会根据方法名的不同判断具体调用哪个方法. 创建一个Driver类,类中实现了对driver方法的重载操作. public class Driver { //实现了重载操作 public void drive(){ System.out.println("No Parameter"); } public void drive(String driver){ System.out.p

类成员函数的重载、覆盖和隐藏区别?

1.重载是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同).实现原理上:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的).如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;.那么编译器做过修饰后的函数名称可能是这样的:int_func.str_func.对于这两个函数的调用,在编

C++函数的重载、覆盖和隐藏区别

a.成员函数被重载的特征:(1)相同的范围(在同一个类中)(2)函数名字相同(3)参数不同(4)virtual 关键字可有可无b.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类)(2)函数名字相同(3)参数相同(4)基类函数必须有virtual 关键字 c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:(1)如果派生类的函数与基类的函数同名,但是参数不同.此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)(2)如果派生类的函数