重写,覆盖,隐藏


title: 重写,覆盖,隐藏
date: 2021-05-25 18:22:57
tags:


函数重载(overload)

函数重载是指在一个类中声明多个名称相同但参数列表不同的函数,这些的参数可能个数或顺序,类型不同,但是不能靠返回类型来判断。特征是:
(1)相同的范围(在同一个作用域中);
(2)函数名字相同;
(3)参数不同;参数如果相同就不叫重载
(4)virtual 关键字可有可无(注:函数重载与有无virtual修饰无关);
(5)返回值可以不同

个人总结;重载是除了函数名和所在作用域,其他一切跟原来不同,就像一个人再怎么脱胎换骨改头换面,出生地和名字都不能改。

举例:

class A
{
 public:
    void display(int a,int b)
    {
        printf("This is first/n");
    }
    void* display(int a)
    {
        printf("This is second/n");
    }
};
int main()
{
    A a;
    a.display(5);
    return 0;
}

函数重写(也称为覆盖 override)

函数重写是指子类重新定义基类的虚函数。特征是:
(1)不在同一个作用域(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;重写,顾名思义,重写内容,其他都不变
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同,否则报错
(6)重写函数的访问修饰符可以不同;

class Base
{
 public:

    virtual void g(void)
    {
        std::cout<<"Base::g(void)"<<std::endl;
    }
};

class Derived
:public Base
{
public:
    void g(void)
    {
        std::cout<<"Derived::g(void)"<<std::endl;
    }
};

重定义(也称隐藏)

(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆);
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

class Base
{
public:
    void fun(double,int)
    {
        cout<<"Base::fun(double,int)"<<endl;
    }
}

class Derive
:public Base
{
public:
    void fun(int)
    {
        cout<<"Derive::fun(int)"<<endl;
    }
}
参数 返回值 virtual 作用域
重载 不同 不同 可有可无 相同
重写(覆盖) 相同 相同 不同
重定义(隐藏) 不同 不同 可有可无 不同

隐藏规则似乎很愚蠢。但是隐藏规则至少有两个存在的理由:

  • 写语句pd->f(10)的人可能真的想调用Derived::f(char *)函数,只是他误将参数写错了。有了隐藏规则,编译器就可以明确指出错误,这未必不是好事。否则,编译器会静悄悄地将错就错,程序员将很难发现这个错误,流下祸根。
  • 假如类Derived有多个基类(多重继承),有时搞不清楚哪些基类定义了函数f。如果没有隐藏规则,那么pd->f(10)可能会调用一个出乎意料的基类函数f。尽管隐藏规则看起来不怎么有道理,但它的确能消灭这些意外。

参考:

1,https://blog.csdn.net/Xiejingfa/article/details/48496593

2,https://blog.csdn.net/zx3517288/article/details/48976097?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

你可能感兴趣的:(C++学习总结,c++)