天天看点

C++ 重载 重写 隐藏

一 重载

条件:

1、作用域相同

2、函数名相同

3、参数不同(个数不同、类型不同、顺序不同均可)

举例:

class demo
{
    void fun(int a);
    void fun(int a, int b); // 参数个数不同,重载
    void fun(char *a); // 参数类型不同,重载
    int fun(int a); // 仅返回值不同,非重载
    int fun(int a, char *s); // 返回值不同,参数个数不同,重载
    // 即返回值是否相同均可,不是决定因素

    // 特别的
    void fun(int a) const; // const修饰的常量成员函数构成重载


    // const 修饰参数
    void func(int a);
    void func(const int a);  // 非重载

    void func1(int* a);
    void func1(const int* a); // 重载

    void func2(int* a);
    void func2(int* const a); // 非重载

   // output:
   // 'void demo::func(int)': member function already defined or declared	
   // 'void demo::func2(int *)': member function already defined or declared

};
           

二 重写

也叫做覆盖。

条件:

1、作用域不同(分别在父类和子类中)

2、函数名、参数列表、返回值均要相同

3、必须是虚函数(virtual)

4、访问修饰符可以不同

举例:

class base
{
public:
    virtual void fun();
};

class derived : public base
{
public:
    void fun(); // 重写  (virtual可以忽略不写)
};
           

三 隐藏

跟重写的区别是函数不为虚函数,则子类函数会隐藏父类函数,子类中要调用父类函数,需要加父类作用域。

举例:

class base
{
public:
    void func();
};

class derived : public base
{
public:
    void func(); // 隐藏base的func函数
};
           

四 总结

1、重载和重写最明显的区别是作用域,函数重载作用域相同,函数重写作用域不同。

2、重写和隐藏最明显的区别是是否为虚函数。