重载、覆盖、多态与函数隐藏
### 重载、覆盖、多态与函数隐藏 在深入探讨重载、覆盖、多态与函数隐藏之间的复杂且微妙关系之前,我们首先要回顾一下这些基本概念。 #### 1. 函数重载(Overloading) 函数重载允许在一个作用域内定义多个同名函数,只要它们的参数列表不同即可。这意味着可以通过传递不同类型的参数或不同数量的参数来调用不同的函数版本。重载的关键在于编译器可以根据传递给函数的参数类型和数量来确定应该调用哪个版本的函数。 #### 2. 函数覆盖(Overriding) 函数覆盖发生在继承结构中。当子类中的函数与其父类中的函数具有相同的名称和参数列表时,子类中的函数会覆盖父类中的函数。这种机制允许子类修改或扩展父类的行为,同时保持相同的接口。为了实现函数覆盖,父类中的函数通常需要声明为`virtual`,这样子类中的函数才能正确地覆盖它。 #### 3. 多态(Polymorphism) 多态是指一个接口可以表示多种类型的能力。在面向对象编程中,这通常通过继承和函数覆盖来实现。多态使得程序可以在运行时根据实际的对象类型来选择合适的函数版本,而不是在编译时就确定下来。这是通过指针或引用指向基类类型来实现的,然后通过这些指针或引用调用虚函数。 #### 4. 函数隐藏(Hiding) 函数隐藏指的是在子类中声明了一个与父类中相同名称的函数,但是参数列表不同,这时子类中的函数并不会覆盖父类中的函数,而是将父类中的函数“隐藏”起来。也就是说,在子类中无法直接访问到被隐藏的父类函数。如果想要访问被隐藏的函数,需要通过父类指针或者父类引用来进行调用。 ### 示例分析 让我们通过一个具体的例子来更好地理解这些概念: ```cpp #include <iostream> using namespace std; class Base { public: void fun() { cout << "Base::fun()" << endl; } }; class Derive : public Base { public: void fun(int i) { // 函数隐藏 cout << "Derive::fun()" << endl; } }; int main() { Derive d; // 下面一句错误,故屏蔽掉 // d.fun(); // error C2660: 'fun': function does not take 0 parameters d.fun(1); Derive *pd = new Derive(); // pd->fun(); // error C2660: 'fun': function does not take 0 parameters pd->fun(1); delete pd; return 0; } ``` 在这个示例中,`Derive`类中定义了一个名为`fun`的函数,该函数接受一个整型参数。这个函数隐藏了`Base`类中的`fun`函数,后者不接受任何参数。因此,当尝试调用`Derive`对象的`fun`函数时,如果不带参数,则会导致编译错误,因为编译器无法确定是要调用`Base`类中的`fun`还是`Derive`类中的`fun`。要解决这个问题,可以通过以下方式: 1. **显式调用基类函数**:如果希望在`Derive`类中调用`Base`类中的`fun`函数,可以使用`Base::fun()`的方式。 2. **使用基类指针或引用**:通过基类指针或引用调用函数时,可以直接调用`Base`类中的`fun`函数。 ### 总结 - **函数重载**:在同一作用域内定义多个同名函数,但参数列表不同。 - **函数覆盖**:子类中定义的函数与父类中定义的函数具有相同的名称和参数列表,并且父类中的函数需声明为`virtual`。 - **多态**:通过继承和函数覆盖实现的,允许程序在运行时根据实际的对象类型选择合适的函数版本。 - **函数隐藏**:子类中定义的函数与父类中定义的函数具有相同的名称,但参数列表不同,导致父类中的函数被隐藏。
剩余21页未读,继续阅读
- DCJZ_0012012-12-03总结很详细
- cleanmysoul2013-01-08总结的很不错,样例也很丰富
- 粉丝: 47
- 资源: 387
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Boot和Vue的社交平台系统.zip
- 深入理解Java函数式Smashing和Streams API.zip
- (源码)基于Spring Boot框架的酒店管理系统.zip
- 浏览 JavaScript 程序的语言和原理 45 节课程,+6 个小时的视频和 130 个笑话 .zip
- 流汇总器和基数估计器 .zip
- 此存储库适用于 Linkedin Learning 课程学习 Java.zip
- (源码)基于STM32和AD9850的无线电信标系统.zip
- (源码)基于Android的新闻推荐系统.zip
- 本资源库是关于“Java Collection Framework API”的参考资料,是 Java 开发社区的重要贡献,旨在提供有关 Java 语言学院 API 的实践示例和递归教育关系 .zip
- 插件: e2eFood.dll