热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++继承机制与函数遮蔽详解

本文详细介绍了C++中的三种继承方式及其访问控制规则,并探讨了函数遮蔽现象及其解决方法。

文章目录

  • 1. 三种继承方式
  • 2. 函数遮蔽
1. 三种继承方式

在C++中,继承是一种重要的面向对象编程机制,允许子类继承父类的成员(包括成员变量和成员函数)。根据不同的继承方式,子类对父类成员的访问权限会有所不同。

Public继承:

父类访问权限继承方式子类访问权限
publicpublicpublic
protectedpublicprotected
privatepublic不可见(继承了,但无法访问)

Protected继承:

父类访问权限继承方式子类访问权限
publicprotectedprotected
protectedprotectedprotected
privateprotected不可见(继承了,但无法访问)

Private继承:

父类访问权限继承方式子类访问权限
publicprivateprivate
protectedprivateprivate
privateprivate不可见(继承了,但无法访问)

子类内部访问父类成员的权限取决于父类成员本身的访问权限和继承方式中权限较小的一个。开发中最常用的继承方式是public继承,因为这种方式保留了父类原有的成员访问权限。需要注意的是,访问权限不会影响对象的内存布局。

2. 函数遮蔽

当子类中定义了一个与父类同名的函数时,无论父类中有多少个同名函数,子类都无法直接访问这些同名函数。如果需要调用父类中的同名函数,可以通过以下两种方法实现:

(1) 在子类的成员函数中,使用父类名::函数名来显式调用父类的成员函数。

#include 
using namespace std;
class Person {
public:
void run() { cout <<"Person::run()" < void run(int) { cout <<"Person::run(int)" < void run(int, int) { cout <<"Person::run(int, int)" <};
class Student : public Person {
public:
void run() { Person::run(); cout <<"Student::run()" <};
int main() {
Student stu;
stu.run();
return 0;
}

(2) 在C++11及更高版本中,可以通过using关键字将父类的同名函数引入到子类中,使它们在子类中以重载的形式可见。

#include 
using namespace std;
class Person {
public:
void run() { cout <<"Person::run()" < void run(int) { cout <<"Person::run(int)" < void run(int, int) { cout <<"Person::run(int, int)" <};
class Student : public Person {
public:
using Person::run;
void run(int) { cout <<"Student::run(int)" <};
int main() {
Student stu;
stu.run();
stu.run(10); // 如果同名同参,则仍调用子类自己的
stu.run(10, 20);
return 0;
}

推荐阅读
  • POJ2263是一个经典的图论问题,涉及寻找从起点到终点的最大载重路径。本文将详细介绍该问题的背景、解题思路及代码实现。 ... [详细]
  • 本题涉及一个长度为n的序列{ai},代表一系列树木的美学价值。任务是处理m个查询,每个查询提供三个参数l、r和P,目标是在所有满足l < l' ... [详细]
  • HNOI2003 激光炸弹问题(二维前缀和的应用)难度:中等
    HNOI2003 激光炸弹问题是一个经典的二维前缀和应用题目。本文将详细介绍如何使用二维前缀和解决该问题。 ... [详细]
  • 题目编号:2049 [SDOI2008]Cave Exploration。题目描述了一种动态图操作场景,涉及三种基本操作:断开两个节点间的连接(destroy(a,b))、建立两个节点间的连接(connect(a,b))以及查询两节点是否连通(query(a,b))。所有操作均确保图中无环存在。 ... [详细]
  • 深入浅出C语言指针
    指针是C语言中极其重要的数据类型,广泛应用于各种数据结构的表示、数组和字符串的操作以及内存地址的处理。本文将通过实例详细解析指针的基本概念及其应用。 ... [详细]
  • 题目描述:计算从起点到终点的最小能量消耗。如果下一个单元格的风向与当前单元格相同,则消耗为0,否则为1。共有8个可能的方向。 ... [详细]
  • C++中构造函数与析构函数的虚函数特性及多态行为分析
    本文探讨了C++中构造函数和析构函数是否可以定义为虚函数,以及它们在多态行为中的表现。通过实例代码详细解释了虚函数表指针的初始化时机及其对多态的影响。 ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • 本文详细解析了NYOJ20 - 吝啬的国度问题,通过图的深度优先搜索(DFS)算法解决路径查询问题。 ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • 开发笔记:1035 Password (20) ... [详细]
  • 本文详细介绍了Sleep函数的基本概念、使用方法及其背后的实现原理。适合对Sleep函数的使用和实现感兴趣的开发者阅读。通过本文,您将了解如何在不同操作系统中使用Sleep函数,以及其在多线程编程中的重要性。 ... [详细]
  • Ray在数学课上了解到,任何小数都可以表示成分数的形式。他在尝试将普通小数转换为分数的过程中,进一步思考了如何将循环小数也转换为最简分数。本文将介绍一种算法,不仅能够处理普通小数,还能处理循环小数。 ... [详细]
  • 本文介绍了如何使用 Gesture Detector 和 overridePendingTransition 方法来实现滑动界面和过渡动画。 ... [详细]
  • 本文介绍如何编写一个函数来交换二维数组a[4][5]中的第0行与第3行,以及第1行与第2行的值。同时,在main函数中调用该函数并打印交换前后的数组。 ... [详细]
author-avatar
Tong-david
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有