简介: C++重载(overload)、重写(overrride)、重定义(redefine)总结

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


编程环境: deepin 15.11 x64 专业版 Kernel: x86_64 Linux 4.15.0-30deepin-generic

编程软件: Qt Creator 4.8.2 (Enterprise)Qt 5.9.8


一、重载(overload)

指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
(5)返回值可以不同;


二、重写(也称为覆盖 override)

是指派生类重新定义基类的虚函数,特征是:
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同(或是协变),否则报错;<—-协变这个概念我也是第一次才知道…

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


三、重定义(redefine,也称隐藏)

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


重定义redefine的代码演示:

情况一:参数不同:

/*重定义(也成隐藏):
参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆)*/
class My
{
public:
    My();
    void fun();
    void fun(int n);
    void fun(QString str);
    void fun(int n, QString str);
};

class MySon : public My
{
public:
    MySon();
    void fun(double n);
};

---------------------------------------
//或

class My
{
public:
    My();
    virtual void fun();
    virtual void fun(int n);
    virtual void fun(QString str);
    virtualvoid fun(int n, QString str);
};

class MySon : public My
{
public:
    MySon();
    void fun(double n);
};

---------------------------------------
//运行以下代码,会得到一样测试结果 
int main(int argc, char *argv[])
{
    MySon mySon;
    mySon.fun(5.2);      //使用时候,会有唯一"智能提示",只有double的版本
    //mySon.fun("str");  //尝试调用My::fun(QString), 但是被隐藏,会编译不过
    return a.exec();
}

运行结果:

编码智能提示时候:只有一个

运行结果:


情况二:参数相同:

/*重定义(也成隐藏):
参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) */
class My
{
public:
    My();
    void fun();
    void fun(int n);
    void fun(QString str);
    void fun(int n, QString str);
};

class MySon : public My
{
public:
    MySon();
    void fun(int n);
};

运行效果:


参考文章:

C++ 重载(overload)、重写(overrride)、重定义(redefine)总结