c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)}

重载

•  概念:在同一个作用域内;函数名相同,参数列表不同(参数个数不同,或者参数类型不同,或者参数个数和参数类型都不同),返回值类型可相同也可不同;这种情况叫做c++的重载!

注意:c语言没有函数重载的机制

•  举例代码:

 #include<iostream>
using namespace std; int Add(int a,int b)
{
return a+b;
} float Add(float a,float b)
{
return a+b;
} int main()
{
cout<<Add(,)<<endl; // 调用 int Add(int a,int b)
cout<<Add(2.5f,3.7f)<<endl; // 调用 float Add(float a,float b)
return ;
}

此时,两个函数Add();在同一作用域,函数名相同都是Add,参数类型不同;就构成了c++中的函数重载;

• c++函数重载达到的效果:调用函数名相同的函数,会根据实参的类型和实参顺序以及实参个数选择相应的函数;

• c++函数重载是一种静态多态(又叫做静态联编,静态绑定,静态决议)

覆盖(又叫重写)

• 覆盖(重写)的前提条件:父类函数为虚函数;

• 覆盖(重写)的概念:当在子类中定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写(也称覆盖)了父类的这个虚函数。

• 什么是在子类中定义了一个与父类完全相同的虚函数:

有两种情况:

1. 就是说子类中的虚函数和父类中的虚函数,函数名,参数个数,参数类型,返回值类型都相同;这种情况下子类的这个虚函数重写的父类中的虚函数,构成了重写;

2. 协变—是说子类中的虚函数和父类中的虚函数,函数名,参数个数,参数类型都相同,只是返回值类型不同;父类的虚函数返回父类的指针或者引用,子类虚函数返回子类的指针或者引用;这种情况下子类的这个虚函数也重写了父类中的虚函数,也构成了重写;——我们把这种特殊的情况叫做协变

【注意】:在基类中定义了一个与派生类虚函数完全相同的函数,那么这个派生类的函数就是重写了基类的虚函数,此时这个派生类的函数就是虚函数,如果不显示的加上virtual修饰,编译器也会默认为虚函数;

 #include<iostream>
using namespace std; class Person
{
public:
virtual void BuyTickets()
{
cout << " 买票-全票" << endl;
}
protected:
string _name; // 姓名
}; class Student : public Person
{
public:
void BuyTickets()
{
cout << " 买票-半价" << endl;
}
protected:
int _num; //学号
}; void Fun(Person* p)
{
p->BuyTickets();
} void Fun(Person &p)
{
p.BuyTickets();
} void Test()
{
Person p;
Student s;
Fun(p);
Fun(s); Fun(&p);
Fun(&s);
} int main()
{
Test();
system("pause");
return ;
}

输出结果:

举例2:

 #include<iostream>
using namespace std;
class Person
{
public:
virtual Person& BuyTickets()//基类虚函数
{
cout << "成人买票-全票" << endl;
return *this;
}
public:
string _name; // 姓名
}; class Student : public Person
{
public:
virtual Student& BuyTickets()//派生类虚函数
{
cout << "学生买票-半票" << endl;
return *this;
}
public:
int _num; //学号
}; void Fun(Person* p)
{
p->BuyTickets();
} void Fun(Person &p)
{
p.BuyTickets();
}
void Test()
{
Person p;
Student s;
Fun(p);
Fun(s); Fun(&p);
Fun(&s);
}
int main()
{
Test();
system("pause");
return ;
}

输出结果:

参考资料

1.c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)

【C++】三大概念要分清--重载,隐藏(重定义,覆盖(重写)的更多相关文章

  1. c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)

    重载,隐藏(重定义),覆盖(重写)—这几个名词看着好像很像,不过其实一样都不一样!! 综述: 说明:覆盖中的访问修饰符可以不同是指可以不用显示地用virtual:当访问修饰符改为const或者stat ...

  2. C++中重载、重定义、重写概念辨析

    重载:函数名相同,函数的参数个数.参数类型或参数顺序三者中必须至少有一种不同.函数返回值的类型可以相同,也可以不相同.发生在一个类内部. 重定义:也叫做隐藏.覆盖,子类重新定义父类中有相同名称的非虚函 ...

  3. C++ 虚函数及重载、重定义、重写

    #include<iostream> usingnamespace std; class BASE { public: BASE()=default; BASE(int publicVal ...

  4. C++重写(覆盖)、重载、重定义、多态

    1 重写(覆盖)override override是重写(覆盖)了一个方法,以实现不同的功能.一般用于子类在继承父类时,重写(覆盖)父类中的方法.函数特征相同,但是具体实现不同. 重写需要注意: 被重 ...

  5. C++重写与重载、重定义

    文章引用自:http://blog.163.com/clevertanglei900@126/blog/static/111352259201102441934870/ 重载overload:是函数名 ...

  6. (转)C++重写、重载和重定义的区别

    C++ 重写重载重定义区别 (源自:http://blog.163.com/clevertanglei900@126/blog/static/111352259201102441934870/) 1 ...

  7. C++重写(覆盖)、重载、重定义、

    总结: 重写(覆盖)override 是指派生类函数重写(覆盖)基类函数 不同的范围,分别位于基类和派生类中 函数的名字相同 参数相同 基类函数必须有virtual关键字 重载overload 成员函 ...

  8. c++ 重载,覆盖,重定义 2

    前一篇 http://www.cnblogs.com/iois/p/4085173.html 写有些地方不够准确,重新整理了一遍 函数重载(Function Overloading) C++允许同一范 ...

  9. C++学习笔记 封装 继承 多态 重写 重载 重定义

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

随机推荐

  1. windows单机环境下配置tomcat集群

    场景:我们在平常联系中,需要涉及到tomcat中,但是电脑不够怎么办,肯定是在自己的电脑上模拟集群,就是装多个tomcat,这时候需要稍微配置下.如果是多个服务器,那不用配置,直接怼!!! 这里介绍的 ...

  2. Linux记录-Linux Swap分区虚拟内存相关解决方案

    Swap用途:Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区.当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临 ...

  3. vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询

    vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询 基于element Transfer http://element-cn.eleme.io/#/zh-CN/comp ...

  4. IDEA中设置注释模板的方法

    IDEA中设置注释模板主要分为两个部分,分别是创建java文件时类的注释和方法的注释. 这里为大家详细介绍一下方法,按MyEclipse的风格设置(MyEclipse的请看:MyEclipse中设置注 ...

  5. Ubuntu(16.04.2)学习笔记(一)如何解决dpkg: error processing install-info

    一.服务器安装软件是出现以下的错误信息: www@TinywanAliYun:~$ sudo apt-get install letsencrypt Reading package lists... ...

  6. angularjs指令中scope参数 true、false、{} 的区别详解

    scope 有三个参数 true.false.{} scope 默认是 false,当 scope设置为true时,会从父作用域继承并创建一个新的作用域对象, 按照true .false的反向思维,我 ...

  7. JavaScript之12306自动刷新车票[待完善]

    function refresh(){ var search_btn = document.getElementById("query_ticket"); var result_t ...

  8. Ubuntu16.04安装搜狗拼音输入法(中文输入法)

    虽然网上有很多教程,但是我觉得我的很适合那些真正的小白... 1.下载文件 由于我要给多台电脑安装搜狗输入法,所以用的是文件夹安装,不是命令行安装. 打开官网http://pinyin.sogou.c ...

  9. dataTable插件锁表头和锁列的教程

    源代码下载 我的同事让我帮忙给弄个锁头锁列的插件.结果找到大名鼎鼎的jquery dataTable插件. 今天我们来介绍不常用的功能:dataTable插件锁表头和锁前两列 由于是移动前端.我们不考 ...

  10. 中间人攻击之ettercap嗅探

    中间人攻击: 中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的 ...