C++ 重载、重写、重定义的区别
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)
定义:
重写也叫做覆盖。子类 重新定义 父类中 有相同名称和参数 的 虚函数。函数特征相同,但是具体实现不同,主要是在继承关系中出现的 。简单说,重写(覆盖) 是指 派生类函数覆盖基类函数 。
注意:
被重写的函数不能是 static 的。必须是 **virtual **的。
重写函数必须有 相同的类型,名称和参数列表
重写函数的访问修饰符可以不同。尽管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++ 重载、重写、重定义的区别的更多相关文章
- c++ 浅拷贝和深拷贝    指针和引用的区别    malloc(free)和new(delete)的区别  重载重写重定义
		
4.malloc(free)和new(delete)的区别 malloc()函数: 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void ...
 - (转)C++重写、重载和重定义的区别
		
C++ 重写重载重定义区别 (源自:http://blog.163.com/clevertanglei900@126/blog/static/111352259201102441934870/) 1 ...
 - 重载重写重定义-易混淆概念-C++编译器处理方式
		
1.函数重载 1)必须在同一个类中进行. 2)子类无法重载父类的函数,父类同名函数将被名称覆盖 3)重载是在编译期间根据参数类型和个数决定函数调用 2.函数重写 1)必须发生于父类与子类之间 2)并且 ...
 - C++ 重载 重写 重定义
		
重写:存在于类的继承,修饰符是virtual,函数的参数个数,顺序,类型,均相同. 重载:函数的参数列表,类型,顺序不相同. 重定义:对父类的函数进行屏蔽,参数列表可以不相同,没有virtual修饰
 - C++ 学习笔记 (八)重载 重写 重定义以及名字覆盖
		
学习C++必定会遇到重载.重写.重定义.概念的东西多也是学习C++蛋疼之处,但是还是得弄懂,学懂了也就不觉得多了. 概念,特点: 重载: 直白点说就是函数名字相同,传参的个数,类型不一样.判断标准在于 ...
 - C++重写与重载、重定义
		
文章引用自:http://blog.163.com/clevertanglei900@126/blog/static/111352259201102441934870/ 重载overload:是函数名 ...
 - C++重写(覆盖)、重载、重定义、
		
总结: 重写(覆盖)override 是指派生类函数重写(覆盖)基类函数 不同的范围,分别位于基类和派生类中 函数的名字相同 参数相同 基类函数必须有virtual关键字 重载overload 成员函 ...
 - C++ 虚函数及重载、重定义、重写
		
#include<iostream> usingnamespace std; class BASE { public: BASE()=default; BASE(int publicVal ...
 - C++重写(覆盖)、重载、重定义、多态
		
1 重写(覆盖)override override是重写(覆盖)了一个方法,以实现不同的功能.一般用于子类在继承父类时,重写(覆盖)父类中的方法.函数特征相同,但是具体实现不同. 重写需要注意: 被重 ...
 
随机推荐
- thinkphp5自带workerman应用
			
1.在vendor/workerman/文件夹下建立server.php文件,内容如下: <?php use Workerman\Worker; require_once __DIR__ . ' ...
 - k8s-PodApi对象
			
init容器 pod的生命周期钩子 资源限制 podApi对象概览 apiVersion + kind 一个是版本 一个是资源组 共同确定当前yaml由谁来管理 metadata元数据 用来唯一标 ...
 - 鸿蒙内核源码分析(事件控制篇) | 任务间多对多的同步方案 | 百篇博客分析OpenHarmony源码 | v30.02
			
百篇博客系列篇.本篇为: v30.xx 鸿蒙内核源码分析(事件控制篇) | 任务间多对多的同步方案 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 自旋锁当 ...
 - P4351-[CERC2015]Frightful Formula【组合数学,MTT】
			
正题 题目链接:https://www.luogu.com.cn/problem/P4351 题目大意 \(n*n\)的矩形,给出第一行和第一列的数,剩下的满足\(F_{i,j}=a*F_{i,j-1 ...
 - CreateRemoteThread创建远程线程
			
要实现线程的远程注入必须使用Windows提供的CreateRemoteThread函数来创建一个远程线程 该函数的原型如下: HANDLE CreateRemoteThread( HANDLE hP ...
 - Java(一)——基础知识
			
引言 之前一直对 Java 怀有固执的偏见,以为 Java 是编写前端的语言,作为一个机械生,非常抗拒去学它. 但是最近接触一点以后,完全改观了先前的看法,于是开启了对 Java 的大学习. 一.数据 ...
 - Redis基础数据结构-基于2.8
			
SDS SDS是Redis中String的底层数据结构,数据结构如下,SDS保留了传统的C字符串表达方式即数组的最后一个元素是'/0'结尾.此外还添加了两个字段len和free,其中len表示字符串长 ...
 - Django整理(四) - URL配置
			
1. URL配置 一.需求 1. 需求:在浏览器访问URL地址 http://127.0.0.1:8000/users/index 时,显示hello django信息 2. 实现 i. 需要编写一个 ...
 - null与undefined到底有啥区别?
			
话不多说,直接先上结论: null 和 undefined 基本相同,只有细微差别 null 是表示缺少的标识,指示变量未指向任何对象,转为数值为 0 undefined 表示 "缺少值&q ...
 - jmx_prometheus_javaagent+prometheus+alertmanager+grafana完成容器化java监控告警(二)
			
一.拓扑图 二.收集数据 2.1前期准备 创建共享目录,即为了各节点都创建该目录,有两个文件,做数据共享 /home/target/prom-jvm-demo 1.下载文件 jmx_prometheu ...