重载、重写、隐藏是什么?

博客介绍了函数重载、重写(覆写)和隐藏(重定义)的相关知识。重载需在同一作用域,函数名相同但参数有差异,属于静态多态;重写要求在基类和派生类,函数名、参数、返回值相同且基类函数为虚函数,是动态多态前提;隐藏指基类和派生类函数名相同但不构成重写,可通过特定方式访问被隐藏函数。

重载:

构成重载的条件:1、在同一作用域下;
        2、函数的函数名相同、参数个数不同 或 参数类型不同 或 参数顺序不同。

 函数重载是在编译期间对函数的参数类型进行推演,根据合适的类型去调用不同的函数,所以函数重载也叫静态多态(或者静态绑定)。

重写(覆写):

构成重写的条件:1、两个函数分别在基类和派生类的作用域;
        2、函数名相同、参数相同、返回值相同(协变除外);
        3、基类函数必须是虚函数。

  重写是对于程序猿的叫法,而覆写是对于底层的叫法。重写是将子类的虚表中父类函数的地址给覆盖了。
  所以构成动态多态的前提就是要 虚函数、且构成重写。在传参的时候根据传的是父类对象的指针或引用还是子类对象的指针或引用来决定调用哪个函数。

隐藏(重定义):

构成隐藏的条件:1、两个函数分别在基类和派生类的作用域;
        2、函数名相同;
        3、两个基类和派生类的同名函数不构成重写。

  隐藏是因为子类中有与父类同名的函数,在子类中找不到父类的函数,但是想要在子类中访问父类被隐藏的函数也可以,就要加上父类类名以及作用域限定符。通过父类::被隐藏的函数来访问

函数重载函数重写存在多方面的区别: - **定义与作用域**:函数重载是在一个类或命名空间中,定义多个同名函数,但参数类型或个数必须有所区别。编译器根据传递的参数类型个数确定调用的函数,使代码更简洁,能以直观方式表达逻辑,适用于同一作用域(如类或命名空间)。函数重写则是派生类对基类虚函数的重新定义,一定分别位于派生类与基类中,当存在继承关系时,派生类作用域嵌套在基类作用域内,派生类可重用基类名字,重写函数会隐藏基类的同名成员 [^1][^2][^4]。 - **参数列表**:函数重载要求函数的参数列表不同,包括参数类型、数量或顺序,但与返回类型无关,返回类型不能用于区分重载函数。函数重写要求重写函数与基类被重写的虚函数具有相同的函数签名,即返回类型形参列表都相同 [^2][^4]。 - **基类函数要求**:函数重载对基类函数无特殊要求,主要关注同一作用域内同名函数的参数差异。函数重写时,基类函数必须声明为虚函数(`virtual`),否则子类中定义的同名函数只是一个新函数,与基类函数无关,子类中重写函数可声明也可不声明 `virtual` [^3]。 - **调用机制**:函数重载由编译器在编译时根据实参的类型数量来静态绑定调用的函数。函数重写是在运行时根据对象的实际类型,通过虚函数表进行动态绑定,即基类指针或引用指向派生类对象时,调用的是派生类重写后的函数 [^1][^4]。 ### 代码示例 ```cpp #include <iostream> // 函数重载示例 class OverloadExample { public: // 重载函数1 void print(int num) { std::cout << "Printing int: " << num << std::endl; } // 重载函数2 void print(double num) { std::cout << "Printing double: " << num << std::endl; } }; // 函数重写示例 class Base { public: // 虚函数 virtual void display() { std::cout << "Base class display" << std::endl; } }; class Derived : public Base { public: // 重写基类的虚函数 void display() override { std::cout << "Derived class display" << std::endl; } }; int main() { // 函数重载调用 OverloadExample oe; oe.print(10); oe.print(3.14); // 函数重写调用 Base* basePtr; Derived derivedObj; basePtr = &derivedObj; basePtr->display(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值