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

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,类成员函数重载:局部同名函数将隐藏而不是重载全局声明,不引入父类名字空间时子类的同名函数不会和父类的构成重载,静态成员函数可以和非静态成员函数构成重载

posted @   bonelee  阅读(6765)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示