当前位置: 首页 > java >正文

继承体系中的隐藏机制解析(继承中的作用域)

目录

一、基本概念

二、成员变量隐藏示例

三、成员函数隐藏

重要提示:

四、总结说明

五、典型示例

六、相关选择题讲解

1、下面代码中的A和B类中的两个func构成什么关系()

知识回顾:函数签名(Function Signature)

2、下面程序的编译运行结果是什么()


一、基本概念

        在继承体系中,基类和派生类拥有各自独立的作用域。当派生类与基类中存在同名成员时,派生类成员会屏蔽对基类同名成员的直接访问,这种情况称为隐藏(Hide)或重定义(Redefinition)。


二、成员变量隐藏示例

以下代码展示了成员变量的隐藏现象:

#include <iostream>
#include <string>
using namespace std;// 基类
class Person {
protected:int _num = 111;  // 身份编号
};// 派生类
class Student : public Person {
public:void fun() {cout << _num << endl;  // 访问的是Student类的_num}
protected:int _num = 999;  // 学号
};int main() {Student s;s.fun();  // 输出:999return 0;
}

若要访问基类中的同名成员,需使用作用域限定符::)显式指定:

void fun() {cout << Person::_num << endl;  // 输出:111(访问基类的_num)
}


三、成员函数隐藏

成员函数的隐藏只需函数名相同即可构成,与参数列表无关:

        例如,对于以下代码,调用成员函数fun时将直接调用子类当中的fun,若想调用父类当中的fun,则需使用作用域限定符指定类域。

#include <iostream>
#include <string>
using namespace std;// 基类
class Person {
public:void fun(int x) {cout << x << endl;}
};// 派生类
class Student : public Person {
public:void fun(double x) {  // 与基类fun函数构成隐藏cout << x << endl;}
};int main() {Student s;s.fun(3.14);           // 调用Student::fun(double)s.Person::fun(20);     // 调用Person::fun(int)return 0;
}

重要提示

        基类与派生类中的fun函数不构成函数重载,因为函数重载要求在同一作用域内。为避免混淆,在继承体系中应尽量避免定义同名成员。


四、总结说明

  1. 继承体系中基类和派生类拥有独立作用域

  2. 派生类与基类同名成员构成隐藏关系,派生类成员屏蔽基类成员的直接访问

  3. 可使用基类::基类成员语法显式访问被隐藏的基类成员

  4. 成员函数只需函数名相同即构成隐藏,与参数类型和数量无关

  5. 实际开发中应尽量避免在继承体系中定义同名成员


五、典型示例

#include <iostream>
#include <string>
using namespace std;class Person {
protected:string _name = "小李";int _num = 111;  // 身份证号
};class Student : public Person {
public:void Print() {cout << "姓名:" << _name << endl;cout << "身份证号:" << Person::_num << endl;  // 显式访问基类成员cout << "学号:" << _num << endl;              // 访问派生类成员}
protected:int _num = 999;  // 学号(与基类_num构成隐藏)
};int main() {Student s1;s1.Print();return 0;
}


六、相关选择题讲解

1、下面代码中的A和B类中的两个func构成什么关系()

答案:B.隐藏

解析:虽然函数签名不同,但因处于不同作用域且函数名相同,构成隐藏关系而非重载。

知识回顾:函数签名(Function Signature)

函数签名是编译器用于区分不同函数的一个唯一标识。它主要由以下部分组成:

  1. 函数名

  2. 参数列表(参数的类型数量顺序

特别注意:函数的返回类型不属于函数签名的一部分。

2、下面程序的编译运行结果是什么()

答案:A.编译报错

解析:b.fun()调用会产生编译错误,因为派生类的fun(int)隐藏了基类的fun(),而b.fun()找不到无参版本。需要使b.A::fun()显式调用基类函数。

class A {
public:void fun() {cout << "func()" << endl;}
};class B : public A {
public:void fun(int i) {  // 隐藏了A::fun()cout << "func(int i)" << i << endl;}
};int main() {B b;b.fun(10);     // 正确:调用B::fun(int)b.fun();    // 错误:A::fun()被隐藏b.A::fun();    // 正确:显式调用基类函数return 0;
}
http://www.xdnf.cn/news/19603.html

相关文章:

  • MongoDB主从切换实战:如何让指定从库“精准”升级为主库?保姆级教程!
  • 基于单片机智能家居语音控制系统
  • 如何在VS Code远程连接Xshell使用
  • Linux - Redis离线安装(安装包的方式安装Redis)
  • 从Redisson分布式锁看锁的设计思路
  • IPC 进程间通信 interprocess communicate
  • 企业微信AI落地:如何选择企业微信服务商?
  • Axios拦截器:前端通信的交通警察[特殊字符]
  • 搭载AX650N高能效比智能视觉芯片——AX2050系列边缘计算盒,可应用在智慧安防交通仓储教育,人脸识别,明厨亮灶,安全生产,智能机器人等
  • table表格字段明细展示
  • 不透明指针
  • 【iOS】折叠cell
  • 《青衣剑客 · Claude》连载
  • 总线矩阵的原理
  • 如何将多个Excel报表合并为一个汇总文件?
  • N32G43x Bootloader 中 ENV 区的管理与实现
  • 前缀和(优化算法)
  • ClickHouse常见问题——ClickHouseKeeper配置listen_host后不生效
  • 面试 TOP101 动态规划专题题解汇总Java版(BM62 —— BM82)
  • 二、SVN基础命令速查表
  • leetcode 1792. 最大平均通过率 中等
  • 通过 select into outfile / load data infile 进行数据导入导出学习笔记
  • 开源项目_金融分析工具TradingAgents
  • 01数据结构-红黑树
  • python 数据类型【python进阶一】
  • java设计模式一、单例模式
  • 【K8s】整体认识K8s之Configmap、Secret/ResourceQuota资源配额/访问控制
  • Linux应用开发-windows,linux环境下相关工具
  • Adobe Illustrator 2025最新破解教程下载安装教程,Illustrator2025最新版下载
  • AI 安全与伦理:当大模型拥有 “决策能力”,我们该如何建立技术边界与监管框架?