在学习C++的继承与多态过程中我们接触到了隐藏与覆盖的概念,那么隐藏和覆盖分别做了些什么?

  • 在C++的继承中我们知道派生类可以继承基类的成员变量和成员函数,那么当派生类继承基类的成员变量和成员函数时自己也有同名的成员变量和同名且同参数列表的成员函数时是如何处理的呢?

  • 遇到这类情况C++的处理方式为隐藏和覆盖,下面就来介绍隐藏和覆盖。

隐藏

  • 派生类将继承的基类的同名的成员变量和成员方法隐藏起来,通过派生类只能访问到自己的成员变量和成员方法。若想要访问基类的成员变量和成员方法需加上基类的作用域。隐藏以后的直接效果就是:无论在派生类的内部或者外部(通过派生类成员)访问该成员;全都是访问派生类的同名成员; 如果在派生类内部或者外部(通过派生类成员)访问同名的成员函数,则需要根据函数调用的规则来调用派生类的同名成员函数;

例如:

#include<iostream>
using namespace std;
class A
{
public:void Show(){cout << "A::Show()" << endl;}
public:int ma = 10;
};
class B : public A
{
public:void Show(){cout << "B::Show" << endl;}
public:int ma = 20;
};int main()
{B b;B *pb = &b;pb->Show();cout << pb->ma << endl;pb->A::Show();cout << pb->A::ma << endl;
}

覆盖(重写)

  • 覆盖往往与继承的类中有virtual修饰的函数有关。virtual修饰的函数为虚函数。而要构成覆盖就得满足基类中有virtual修饰的函数,而在派生类中有与基类中的虚函数同名且同参数列表的函数,那么派生类中的的该函数就会将基类中的函数覆盖,调用时无法调用基类中的函数。在子类中定义了一个与父类虚函数完全相同的函数,那么这个子类的函数就是重写了父类的虚函数,此时这个子类的函数就是虚函数,如果不显示的加上virtual修饰,编译器也会默认为虚函数。
  • 覆盖(重写)达到的效果:
    • 在子类中重写了父类的虚函数,那么子类对象调用该重写函数,调用到的是子类内部重写的虚函数,而并不是从父类继承下来的虚函数;(这其实就是动态多态的实现);
    • 在子类中重写了父类的虚函数,如果用一个父类的指针(或引用)指向(或引用)子类对象,那么这个父类的指针或用引用调用该重写的虚函数,调用的是子类的虚函数;相反,如果用一个父类的指针(或引用)指向(或引用)父类的对象,那么这个父类的指针或用引用调用该重写的虚函数,调用的是父类的虚函数。
#include<iostream>
using namespace std;
class A
{
public:virtual void Show(){cout << "A::Show()" << endl;}
public:int ma = 10;
};
class B : public A
{
public:void Show(){cout << "B::Show" << endl;}
public:int ma = 20;
};int main()
{A *pa = NULL;B *pb = NULL;B b;pa = &b;pa->Show();pb = &b;pb->Show();return 0;
}

基类的指针指向派生类对象,指向的是派生类中基类的部分,此时这个基类的指针调用在派生类中对基类中中虚函数重写的虚函数,调用的是派生类的虚函数。 相反,用一个基类的指针指向基类的对象,那么这个基类的指针调用该重写的虚函数,调用的是基类的虚函数,这是因为在基类中只有这一个函数。用派生类的指针调用该函数也调用的是派生类自己的函数。

补充:基类的指针能够指向派生类,这是因为派生类由自己的一部分和继承基类部分组成,基类的指针指向派生类其实是指向派生类中的基类部分。相反,派生类的指针无法指向基类。

解析C++隐藏与覆盖相关推荐

  1. C++重载(overload)、重写(overwrite,也称隐藏)、覆盖(override)

    一.重载(overload) 函数名相同,但是它的参数列表中参数的个数.类型或顺序不同.不能靠返回类型来判断.这个最简单,name mangling. (1)函数重载只会发生在同一个作用域中: (2) ...

  2. 深入理解成员函数的重载、隐藏、覆盖规则(二)

    本文作者:islwj 本文出处:http://blog.csdn.net/islwj 声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明 ...

  3. java隐藏与覆盖_Java 隐藏和覆盖

    我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊 ...

  4. C++ 函数重载、隐藏与覆盖的区别

    代码编译运行环境:VS2017+Debug+Win32 1.函数重载(Function Overload) 1.1 定义 C++ 规定在同一作用域中,同名函数的形式参数(指参数的个数.类型或者顺序)不 ...

  5. c++同名函数----重载、隐藏、覆盖

    <一>重载 重载的规则: 函数名称必须相同. 参数列表必须不同(个数不同.类型不同.参数排列顺序不同等). 函数的返回类型可以相同也可以不相同. 仅仅返回类型不同不足以成为函数的重载. 相 ...

  6. C++ 名字重载、隐藏、覆盖

    名字重载Name overloading 如果顶层函数有不同的签名,则函数名可以相同. 如果同一类中的函数有不同的签名,则函数名可以相同. C++中允许在相同的作用域内以相同的名字定义几个不同实现的函 ...

  7. java 覆盖和隐藏_Java覆盖和隐藏2

    先上题,题目如下,请分析输出结果: public class MainClass { public static void main(String[] args) { Fu f = new Zi(); ...

  8. c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)

    一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std;class Parent{ ...

  9. java隐藏与覆盖_java中方法的隐藏和覆盖问题?

    ok()方法在继承时候发生覆盖(重写)了吗? 发生了.在子类B中的ok()方法拥有父类方法相同的方法名和参数列表(signature),所以在这里发生了重写.调用B类对象的ok()方法会print & ...

最新文章

  1. java8 metaspacesize_metaspace默认大小
  2. 自学python需要什么配置的电脑-入门学python需要什么配置的电脑?
  3. redhat linux修改乱码
  4. 超棒的在线Bootstrap主题编辑工具 - lollytin
  5. ibatis学习笔记
  6. python twised系列教程四–twisted Poetry client
  7. 地板之间出现缝隙如何处理?
  8. python获取日期_python 获取日期
  9. 2016 Google中国开发者大会游记
  10. python实现列表去重改变顺序_python实现文本去重且不打乱原本顺序
  11. 系统性能评价的关键指标指标
  12. 绿色版DNF(地下城勇士)全键盘连发工具,支持DNF双开
  13. 新形势下电力监控系统网络安全风险分析与防护对策
  14. 软件-浏览器-GoogleChrome:Google Chrome
  15. BottomNavigationView 动态切换Icon且保留原图颜色
  16. python网页编辑器-网页python编辑
  17. Ubuntu16.04下cuda9.0+cudnn7.0安装指南
  18. YOLOv2原文解读
  19. 第1章第17节:如何使用备注功能对内容进行注释补充 [PowerPoint精美幻灯片实战教程]
  20. 无穷级数的简单求解方法——高等数学

热门文章

  1. 如何批量查询多个众邮快递单号的物流情况
  2. vsphere中的虚拟机配置直通GPU后,启动时出现 模块“DevicePowerOn”打开电源失败 的解决方案
  3. 我,一个靠GitHub打赏谋生的码农,年入十万美元
  4. BombLab Phase-1 Phase-2
  5. QA11 QA32增强
  6. ie11浏览器可以下载java吗_IE11浏览器怎么下载?
  7. 阿里云大学考试python中级题目及解析-python高级
  8. linux下给予全部权限
  9. 奥术飞弹打死精灵龙的概率
  10. 大公司,还是小公司?