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. Golang基础

    Golang官方 https://golang.org/ 使用命令,在本地启动一个go官网 go doc -http=: 访问127.: golang标准库api文档 https://studygol ...

  2. python学习笔记8--面向对象编程

    一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...

  3. asp.net mvc url应用

    //url加密与解密string res1 = HttpUtility.UrlEncode("7Z2K5Lgk/iI="); //值是7Z2K5Lgk%2fiI%3d string ...

  4. sql 储存过程的使用

    --获取所有数据 根据自定义函数传人类型id返回类型名称 USE [Cloths] GO /****** Object: StoredProcedure [dbo].[Proc_all] Script ...

  5. Linux - rar 压缩

    Linux - rar yum -y install libstdc++.so. wget http://rarsoft.com/rar/rarlinux-4.0.1.tar.gz cd rar ma ...

  6. JavaScript之表格操作(二)创建表格病填充表格数据

    //创建表格 var tableOptions = { way: "insertBefore", //insertBefore,append positionId: "d ...

  7. Apple Watch 开发详解

    Apple Watch 开发详解 Apple Watch现在对于第三方开发者来说更多的还是一块额外的屏幕.暂时WatchKit没有能给出足够的接口.现在Watch App的主要运算逻辑需要依赖iPho ...

  8. linux 下安装 oracle

    http://yourcouner.blog.51cto.com/59520/91156 一.RedHat AS4系统安装: 磁盘配置: 设备 类型 大小 / ext3 39911 swap 1024 ...

  9. SpringBoot处理静态资源的两种方式

    静态资源是指----> CSS.JS之类的文件 首先创建SpringBoot Web项目 添加Spring Boot Web Starter <dependency> <gro ...

  10. 信息检索(IR)的评价指标介绍 - 准确率、召回率、F1、mAP、ROC、AUC

    原文地址:http://blog.csdn.net/pkueecser/article/details/8229166 在信息检索.分类体系中,有一系列的指标,搞清楚这些指标对于评价检索和分类性能非常 ...