隐藏和覆盖

本文通过一个C++代码示例介绍了基类与派生类中成员函数的隐藏与覆盖概念,演示了如何使用虚函数实现多态。
#include<iostream>
using namespace std;                                 //包含头文件
class people
{
public:
	void f(int x){cout << "father f(int)\n";}
	
	virtual void g(int x){cout << "father g(int)\n";}


};
class son:public father
{
public:
	void f(int x){cout << "son f(int)\n";} //同名同参,隐藏
	 void f(float x){cout << "son f(float)\n";}//同名不同参,隐藏
     virtual void g(int x){cout << "son g(int)\n";}//同名同参+virtual 覆盖
};
int main()
{
    

	return 0;

}

### C++ 中隐藏覆盖的概念及用法 #### 一、基本概念 在 C++ 中,隐藏覆盖是两个重要的多态机制,它们分别用于处理继承关系中的函数行为。 1. **隐藏 (Hiding)** 当派生类中定义了一个与基类同名的函数时,无论该函数是否具有相同的参数列表,都会发生隐藏现象。这意味着即使基类中有多个重载版本的函数,在派生类中定义的新函数会完全遮蔽这些基类函数[^1]。如果希望访问被隐藏的基类函数,则需要显式地使用作用域解析运算符 `::` 来指定调用基类的成员函数。 2. **覆盖 (Overriding)** 覆盖是一种特殊的隐藏形式,仅当满足特定条件时才会触发: - 派生类基类中的函数名称相同; - 参数列表一致(不考虑隐式的 this 指针); - 返回类型兼容(协变返回类型允许某些差异); - 基类中的函数声明为虚函数 (`virtual`)。 此时,派生类中的函数不会简单地隐藏基类函数,而是提供了一种动态绑定的方式,使得程序能够在运行时决定调用哪个版本的函数[^4]。 --- #### 二、具体表现与示例分析 以下是关于隐藏覆盖的具体代码示例及其解释: ```cpp #include <iostream> using namespace std; class Base { public: virtual void func() { cout << "Base::func()" << endl; } }; class Derived : public Base { public: void func() override { cout << "Derived::func()" << endl; } // 覆盖 void func(int x) { cout << "Derived::func(int): " << x << endl; } // 隐藏 }; int main() { Derived d; Base* p = &d; p->func(); // 动态绑定,调用 Derived::func() d.func(); // 调用 Derived::func() d.func(10); // 调用 Derived::func(int),这是隐藏而非覆盖的行为 } ``` 上述代码展示了两种情况: - 对于 `p->func()` 的调用,由于基类中的 `func` 是虚函数,因此实现了动态绑定并最终调用了派生类中的覆盖版本。 - 对于 `d.func(10)` 的调用,这属于隐藏的情况,因为虽然存在基类中的其他重载版本,但都被派生类新定义的 `func(int)` 所掩盖[^3]。 --- #### 三、主要区别总结 | 特性 | 隐藏 (Hiding) | 覆盖 (Overriding) | |--------------------|---------------------------------------|--------------------------------------| | 是否涉及虚函数 | 不一定 | 必须 | | 函数签名一致性 | 可以不同 | 完全一致 | | 运行时行为 | 编译期静态绑定 | 运行时动态绑定 | | 使用场景 | 处理命名冲突或扩展功能 | 实现多态性接口定制 | --- #### 四、典型应用场景 1. **隐藏的应用** - 在设计层次结构复杂的系统时,可能需要通过隐藏来引入新的语义或者避免不必要的干扰。例如,某个派生类可能不需要保留基类的功能集合,此时可以通过重新定义同名方法达到目的。 2. **覆盖的应用** - 主要应用于支持多态性的场合下,比如 GUI 应用开发框架通常依赖大量虚拟接口让开发者自定义窗口组件的表现逻辑。这种情况下,利用覆盖可以让各个子对象表现出独特特性的同时保持统一的操作入口。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值