C++ 重载 重写 隐藏

本文详细介绍了函数重载与重写的概念及其区别,并通过具体示例解释了如何实现这两种函数多态的方式。此外,还阐述了隐藏的概念及其与重写的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 重载

条件:

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、重写和隐藏最明显的区别是是否为虚函数。

### C++重载重写和覆盖的概念及区别 #### 1. 函数重载 (Function Overloading) 函数重载是指在同一个作用域内定义多个同名函数,但这些函数的参数列表(包括参数的个数、类型或顺序)必须不同。返回值类型的不同并不构成重载[^2]。例如: ```cpp class Example { public: void func(int a) {} // 参数为 int 类型 void func(double a) {} // 参数为 double 类型 void func(int a, int b) {} // 参数为两个 int 类型 }; ``` - **特点**: - 必须在同一作用域内。 - 参数列表必须不同。 - 返回值类型与重载无关。 #### 2. 函数重写 (Function Overriding) 函数重写是指在派生类中重新定义基类中的虚函数,要求函数名、参数列表和返回值类型相同。重写函数可以改变访问修饰符。例如: ```cpp class Base { public: virtual void func() {} // 基类中的虚函数 }; class Derived : public Base { public: void func() override {} // 派生类中的重写函数 }; ``` - **特点**: - 必须在派生类中定义。 - 基类函数必须是虚函数(`virtual`)。 - 参数列表和返回值类型必须一致。 - 访问修饰符可以不同。 #### 3. 函数覆盖 (Function Hiding) 函数覆盖是指派生类中的函数隐藏了基类中同名的函数。即使参数列表不同,基类中的函数也会被隐藏。例如: ```cpp class Base { public: void func() {} // 基类中的函数 }; class Derived : public Base { public: void func(int a) {} // 派生类中的函数,隐藏了基类的 func() }; ``` - **特点**: - 只要函数名相同,无论参数列表是否不同,基类函数都会被隐藏。 - 使用作用域运算符(`::`)可以调用被隐藏的基类函数。 #### 区别与联系 | 特性 | 函数重载 | 函数重写 | 函数覆盖 | |---------------------|--------------------------|--------------------------|--------------------------| | **作用域** | 同一作用域 | 基类与派生类之间 | 基类与派生类之间 | | **参数列表** | 必须不同 | 必须相同 | 不一定相同 | | **返回值类型** | 无关 | 必须相同或协变 | 无关 | | **虚函数要求** | 不需要 | 基类函数必须为虚函数 | 不需要 | | **访问修饰符** | 无关 | 可以不同 | 无关 | #### 示例代码 以下代码展示了重载重写和覆盖的区别: ```cpp #include <iostream> using namespace std; class Base { public: virtual void func() { cout << "Base::func()" << endl; } // 虚函数 void func(int x) { cout << "Base::func(int)" << endl; } // 非虚函数 }; class Derived : public Base { public: void func() override { cout << "Derived::func()" << endl; } // 重写 void func(int x) { cout << "Derived::func(int)" << endl; } // 覆盖 void func(double x) { cout << "Derived::func(double)" << endl; } // 重载 }; int main() { Derived d; Base* b = &d; b->func(); // 调用 Derived::func()(重写) d.func(1); // 调用 Derived::func(int)(覆盖) d.func(1.0); // 调用 Derived::func(double)(重载) return 0; } ``` ### 输出结果 ``` Derived::func() Derived::func(int) Derived::func(double) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值