C++ 中 重载、重写、重定义的区别

重载(overload)

定义:

在同一个作用域内,两函数的函数名相同, 参数不相同(可以是参数类型不同或者是参数个数不同), 那么就说这两个 函数重载

分类:函数重载 和 运算符重载 (本质都一样)

注意: 返回值类型 不是 函数重载判断依据。

成员函数重载特征:

a : 相同的范围(在同一个类中)

b : 函数名字相同

c : 参数不同

实现重载原理:

C++代码在编译时会根据参数列表对函数进行重命名,例如void Test(int a, int b)会被重命名为_Test_int_int,void Test(int x, double y)会被重命名为_Test_int_double。所以说函数重载从底层上看它们还是不同的函数。

例:

#include<iostream>
using namespace std;
void fun(int a)
{
cout << "int a" << endl;
}
void fun(double a)
{
cout << "double a" << endl;;
}
void fun(int a, int b)
{
cout << "int a , int b" << endl;;
}
int main()
{
//函数名相同,参数不同
fun(1);
fun(1.1);
fun(1,2);
}

输出结果:

int a

double a

int a , int b

重写(override)

定义:

重写也叫做覆盖。子类 重新定义 父类中 有相同名称和参数虚函数。函数特征相同,但是具体实现不同,主要是在继承关系中出现的 。简单说,重写(覆盖) 是指 派生类函数覆盖基类函数

注意:

  1. 被重写的函数不能是 static 的。必须是 **virtual **的。

  2. 重写函数必须有 相同的类型,名称和参数列表

  3. 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public,protected也是可以的

特征:

a : 不同的范围,分别位于基类和派生类中

b : 函数的名字相同

c : 参数相同

d : 基类函数必须有virtual关键字

作用:

通过重写,可以实现动态多态,何为动态多态,就是当父类的指针或引用指向被重写的虚函数时,父类的指针或引用指向谁就调用谁的虚函数,而不是说根据类型。

在这里,如果去掉父类的虚函数的virtual,则构不成多态,如果去掉子类虚函数的virtual可以构成多态,可以理解为编译器优化。

重定义(redefining)

定义:重定义也叫做隐藏。子类 重新定义 父类中有 相同名称非虚函数 ( 参数列表可以不同 ) 。也就是说,重定义(隐藏) 是指 派生类的函数屏蔽了与其同名的基类函数

规则:

a : 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。

b : 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 vitual 关键字,此时,基类的函数被隐藏。

例:

#include<iostream>
using namespace std;
class A{
public:
void f()
{
cout << "A" << endl;
} public:
int _x;
}; class B : public A{
public:
void f(int a)
{
cout << "B" << endl;
} public:
int _x;
}; int main()
{
B b;
b.f();
}

分析:

很明显,子类隐藏了父类的f函数,这个题目比较迷惑人的是子类的f函数有参数,所以会以为调的是父类的f函数; 但是隐藏只与函数名有关,与参数是没关系的,所以调用的还是子类的f函数,这个程序会提示出错(可能是没有匹配的重载函数之类的错误)。

C++ 重载、重写、重定义的区别的更多相关文章

  1. c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义

    4.malloc(free)和new(delete)的区别 malloc()函数: 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void ...

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

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

  3. 重载重写重定义-易混淆概念-C++编译器处理方式

    1.函数重载 1)必须在同一个类中进行. 2)子类无法重载父类的函数,父类同名函数将被名称覆盖 3)重载是在编译期间根据参数类型和个数决定函数调用 2.函数重写 1)必须发生于父类与子类之间 2)并且 ...

  4. C++ 重载 重写 重定义

    重写:存在于类的继承,修饰符是virtual,函数的参数个数,顺序,类型,均相同. 重载:函数的参数列表,类型,顺序不相同. 重定义:对父类的函数进行屏蔽,参数列表可以不相同,没有virtual修饰

  5. C++ 学习笔记 (八)重载 重写 重定义以及名字覆盖

    学习C++必定会遇到重载.重写.重定义.概念的东西多也是学习C++蛋疼之处,但是还是得弄懂,学懂了也就不觉得多了. 概念,特点: 重载: 直白点说就是函数名字相同,传参的个数,类型不一样.判断标准在于 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 关于web桌面应用的集成解决方案

    背景 毫无疑问,面对一个新的项目需求,我们首先想到的就是web. 确实,web太方便了,基于浏览器对OS的适配,我们可以很快速的实现某个需求的页面UI,而无需考虑OS的兼容差异. 再经过jq.boot ...

  2. chrome 的 options 参数

    在使用selenium浏览器渲染技术,爬取网站信息时,默认情况下就是一个普通的纯净的chrome浏览器,而我们平时在使用浏览器时,经常就添加一些插件,扩展,代理之类的应用.相对应的,当我们用chrom ...

  3. Python日常Bug集

    1.TypeError: 'int' object is not iterable: 场景示例: data = 7 for i in data: print(i) # 原因:直接对int数据进行迭代造 ...

  4. SpringBoot整合jdbc及整合Druid数据源

    一.整合jdbc 1.创建一个springInitializr项目 勾选 web----springweb.SQL----JDBC API,MYSQL Diver 2.连接数据库 3.创建yml 4. ...

  5. Docker部署Mysql,如何开启binlog

    0.拉取镜像 sudo docker pull mysql:5.7 1.创建存放映射文件夹 mkdir -p mydata/mysql/log mkdir -p mydata/mysql/data m ...

  6. ORACLE 坏块的模拟和查看

    坏块的模拟和查看使用bbed工具修改数据文件的块,然后使用dbv和rman工具查看坏块. 1.创建数据:根据dbv查看没有坏块Total Pages Marked Corrupt : 0create ...

  7. instanceof和类型转换

    什么是instanceof 判断一个对象是什么类型 注意点 X 和 Y 必须要有父子关系 否则编译都会失败 X对象只要是Y的子类(无论 是 儿子 还是 孙子 还是 曾孙....)X instanceo ...

  8. Git学习笔记01-安装

    首先,什么是git? git是开源的分布式系统,能够将团队的项目上传至git,供团队修改demo 第一步:安装好git(推荐淘宝镜像下载,地址https://npm.taobao.org/mirror ...

  9. 霍尔效应实验 execl数据处理

    execl 函数 =POWER() /*幂次*/ =ROUND() /*保留小数点后几位*/ =SQRT() /*开平方根*/ =POWER( x, 1/3 ) /*开立方根*/ =COUNTA() ...

  10. linux中文件查找、whereis、which、输出命令

    1.文件查找(find):find是最常⻅和最强⼤的查找命令 格式:find / -name  文件名,比如:find / -name mysql.  (1).模糊查找:*是代表所有的,?是代表⼀个字 ...