body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

重载、覆盖与隐藏:
★对类层次中的同名成员函数来说,有3种关系:重载(overload)、覆盖(override)和隐藏(hide、oversee),理清3种关系,有助于写出高质量代码。

重载:
重载的概念相对简单,只有在同一类定义中的同名成员函数才存在重载关系,主要特点是函数的参数类型和数目有所不同,但不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致的。另外,重载和成员函数是否是虚函数无关,举例来说:
class A
{
……
virtual int fun();
void fun(int);
void fun(double,double);
……
};
上述A类定义中的3个fun函数便是重载关系。


覆盖:
★覆盖是指:在派生类中覆盖基类中的同名函数,要求两个函数的参数个数、参数类型、返回类型都相同,且基类函数必须是虚函数
#include<iostream>
using namespace std;
class A
{
        public:
                virtual void fun1()
                {
                        cout<<"A::fun1()"<<endl;
                }
                virtual void fun2()
                {
                        cout<<"A::fun2()"<<endl;
                }
};
class B:public A
{
        public:
                void fun1()  // B中的fun1覆盖了A中的fun1,同时继承了A中的fun2
                {
                        cout<<"B::fun1()"<<endl;
                }
};
class C:public B
{
        public:
                void fun2()
                {
                        cout<<"C::fun2()"<<endl;  //C类继承了B中的fun1,同时重定义覆盖了fun2
                }
};
int main()
{
        A* p = new C;
        p->fun1();
        p->fun2();
        return 0;
}

隐藏:
★隐藏指的是在某些情况下,派生类中的函数屏蔽了基类中的同名函数,这些情况包括:
      ——2个函数参数相同,但基类函数不是虚函数。和覆盖的区别在于基类函数是否是虚函数。
      ——2个函数参数不同,无论基类函数是否是虚函数,基类函数都会被屏蔽。和重载的区别在于两个函数不在同一类中。
#include <iostream>
using namespace std;
class A
{
        public:
                void fun(int xp)    //非虚函数,形参int
                {   cout<<xp<<endl;   }
};
class B : public A
{
        public:
        void fun(const char * s)  //隐藏,oversee,参数为字符串
//参数相同,但是基类不是虚函数,构成隐藏oversee   
        {   cout<<s<<endl;   }
        void fun(int xp)      //重载
        {   cout<<"B::fun()"<<endl;   }
};
int main()
{
        B b;
        b.fun("hello");
        b.fun(2);    //B 中没有void fun(int) 会报错,基类中的被覆盖
        return 0;
}

C++中重载(overload)、覆盖(override)与隐藏(oversee)的更多相关文章

  1. JAVA - 请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

    请说明"static"关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? "static"关键字表明一个成 ...

  2. 区分重载(overload),覆盖(Override)和隐藏(hide)

    重载overload,这个概念是大家熟知的.在同一可访问区内被声名的几个具有不同参数列的(参数的类型.个数.顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制就是重载.重载不关 ...

  3. 重载(overload)、覆盖(override)和隐藏(hide)

    写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的, ...

  4. C++中重载、覆盖与隐藏的区别(转)

    本文摘自林锐博士的<高质量C++/C编程指南>. 成员函数的重载.覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防. 1.重载与覆盖 成员函数被重 ...

  5. java中重载、覆盖和隐藏三者的区别分析

    重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg ...

  6. C++中重载、覆盖和隐藏的区别,以及适用场景

    一.重载.覆盖和隐藏的区别 二.适用场景 1.重载: 适用于不同的数据类型都需要使用到的功能函数.以数据相加的函数为例,可以在同一个文件内提供以下的重载函数以支持同样的功能: int add(int, ...

  7. C# 重载 overload,重写override覆盖

    重载overload 派生类和基类的方法同名,其中访问修饰符(public,private,protected,internal,protected internal),返回类型,参数类型,个数,顺序 ...

  8. C++中的Overload、Override和Overwrite

    在C++语言中有一组基础的概念一直都容易混淆:Overload.Override和Overwrite分别表示什么意思?下面把这三个概念整理一下: 1. Overload(重载) 重载的概念最好理解,在 ...

  9. java中重载和覆盖(又称重写)的区别

    初次见到这两个单词并没有什么特别的感觉,但是时间长了,却发现书上一会儿用override,一会儿又用overload,搞得我的迷迷糊.于是就做了个总结,希望能对和我一样对这两个概念模糊不清的网友有一个 ...

  10. Java中的Overload和Override有什么区别

    Overload和Override的区别 1.Overload 定义 Overload是重载的意思.它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后在调用时,虚拟机就会 ...

随机推荐

  1. PHP如何安装redis扩展(Windows下)

    PHP如何安装redis扩展(Windows下) 一.总结 一句话总结:下载扩展的dll,放入指定文件夹(php对应的扩展的目录php/ext),在配置文件php.ini中注册dll 尽量不要选择最新 ...

  2. MyEclipse下自定义(支持html5的)JSP模板--JSP

    需求:由于某些Mclipse版本发行的比较早,所以在有些版本(比如Mclipse2014,至于其他版本博主不知能不能创建html5格式的JSP页面)里创建JSP页面时html部分不是html5格式的. ...

  3. java,sort函数的深刻理解

    先来看看题目吧: 链接:https://www.nowcoder.com/questionTerminal/97b6a49a85944650b2e3d0660b91c324来源:牛客网 [编程题]德才 ...

  4. canvas获取摄像头的图像

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAugAAAF3CAIAAAB44CnMAAAgAElEQVR4nOy92a4kx5am1y8lQAIkCI

  5. android-------Java 常问的基础面试题

      1."=="和equals方法究竟有什么区别? ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个 ...

  6. drf 认证、权限、限流、过滤、排序、分页器

    认证Authentication 准备工作:(需要结合权限用) 1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py creates ...

  7. 1.numpy_overview

    官网文档:https://www.numpy.org.cn/ Numpy 简介 导入numpy Numpy是Python的一个很重要的第三方库,很多其他科学计算的第三方库都是以Numpy为基础建立的. ...

  8. DedecmsV5.7本地上传缩略图无法自动添加水印的解决方法

    问题:dedecms后台 系统->图片水印设置 图片水印设置有开启了,但是本地上传缩略图无法自动添加水印 网上有很多资料,所以记录一下 1.打开dede(实际项目后台文件夹)/archives_ ...

  9. 20165309 实验二 Java面向对象程序设计

    2017-2018-2 20165309实验二<Java面向对象程序设计>实验报告 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初 ...

  10. js判断数组中是不是有某个元素

    function in_array(search,array){ for(var i in array){ if(array[i]==search){ return true; } } return ...