1.重载和重写的区别:

重载overload:在同一个类中,函数名相同,参数列表不同,编译器会根据这些函数的不同参数列表,将同名的函数名称做修饰,从而生成一些不同名称的预处理函数,未体现多态。

重写override:也叫覆盖,子类重新定义父类中有相同名称相同参数的虚函数,主要是在继承关系中出现的,被重写的函数必须是virtual的,重写函数的访问修饰符可以不同,尽管virtual是private的,子类中重写函数改为public,protected也可以,体现了多态。

重定义redefining:也叫隐藏,子类重新定义父类中有相同名称的非虚函数,参数列表可以相同可以不同,会覆盖其父类的方法,未体现多态。

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

b如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。(如果有virtual就成重写了)

#include <iostream>
using namespace std;
class Base
{
private:virtual void display() { cout<<"Base display()"<<endl; }void show(){ cout<<"Base show()"<<endl; }
public:void exec(){ display(); show(); }void fun(string s) { cout<<"Base fun(string)"<<endl; }void fun(int a) { cout<<"Base fun(int)"<<endl; }//overload:两个fun函数在Base类的内部被重载virtual int function(){}
};
class ClassA:public Base
{
public:void display() { cout<<"ClassA display()"<<endl; }//override:基类中display为虚函数,且参数列表一直,故此处为重写void fun(int a,int b) { cout<<"ClassA fun(int,int)"<<endl; }//redefining:fun函数在Base类中不为虚函数,故此处为重定义void show() { cout<<"ClassA show()"<<endl; }//redefining:理由同上int function(int a){}//overload:注意这是重载而不是重写,因为参数列表不同,在编译时ClassA中其实还有个编译器自己偷偷加上的从Base继承来的int function(){};
};
int main(){ClassA a;Base *base=&a;base->exec();//display()是ClassA的,因为覆盖了,show()是Base自己的a.exec();//结果同上a.show();//show()是ClassA重定义的base->fun(1);//fun()是Base自己的,因为直接从对象base调用a.fun(1, 1);//fun()是ClassA重定义的return 0;
}

执行结果:

2.多态性

“一个接口,多种方法”,程序在运行时才决定调用的函数,C++的多态性是通过虚函数来实现的。最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,这就无法实现一个接口,多种方法的目的了。

a 编译时多态性:通过重载函数实现 。
 b 运行时多态性:通过虚函数实现。

C++重载重写和多态区别相关推荐

  1. 异常概述、常见异常 、自定义异常 、重载重写的异常区别

    1.异常概述         程序运行过程中任何打断程序正常流程的情况称为异常或错误.比如:文件打不开.网络中断.操作符越界.类加载找不到等. Java程序在执行过程中所发生的异常事件可分为两类:   ...

  2. 重载 重写 重用 重构区别

    重写: 一般在面向对象编程语言中重写指的是方法重写, 方法重写又称方法覆盖,就是子类可继承父类中的方法,而不 需要重新编写相同的方法. 但有时子类并不想原封不动地继承父类的方法,想作一定的修改,这就需 ...

  3. 重载 重写 多态区别

    override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法. 重写(覆盖)的规则: 1.重写方法的参数列表必须完全与被重写的方法的相同,否则不 ...

  4. c++ 重载 重写_Java | 深入理解方法调用的本质(含重载与重写区别)

    前言 对于习惯使用面向对象开发的工程师们来说,重载 & 重写 这两个概念应该不会陌生了.在中 / 低级别面试中,也常常会考察面试者对它们的理解(隐约记得当年在校招面试时遇到过): 网上大多数资 ...

  5. 「java」重载重写多态

    在学习继承后,很多同学会混淆:继承后重载,重写和多态的问题,我就写了一个小程序对下面对几个事情进行下解释. 我建议不理解或则有疑惑的地方,可以自己写个类测试一下就会明白其中的含义. 有些图由于csdn ...

  6. java 接口 抽象类 继承 重载 重写 多态

    4.1 抽象类 在面向对象领域由于抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的. 同时,抽象类体现了数据抽象的思想,是实现多态的一种机制.它定义了一组抽象的方法, ...

  7. 面向对象重写(override)与重载(overload)区别

    一.重写(override) override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法. 重写(覆盖)的规则: 1.重写方法的参数列表必须完 ...

  8. Java基础【之】面向对象编程(封装、继承(extends、方法重写、super)、多态(动态绑定、重载/重写)、代码实现)

    Java基础[之]面向对象编程(封装.继承.多态.代码实现) 1.封装 2.继承 2.1.extends 2.2.方法重写 2.3.super 3.多态 3.1.对象的多态.方法的多态 3.2.动态绑 ...

  9. 解析java中方法的重载和重写之间的区别与联系

    解析java中方法的重载和重写之间的区别与联系 1 不同点 1.1 方法重写是在不同的类中(父子类),方法重载是在同一类中 1.2 方法重载最初的目的是构造方法的多样化,方法重写的目的是让重写的方法满 ...

最新文章

  1. Netty(二)——TCP粘包/拆包
  2. 如何把html转换cad,Tab2Xls插件(捷克版)将AutoCAD表格转换为XLS、CSV或HTML。
  3. css为什么要用浮动_CSS中有几种定位?如何使用?
  4. 在 Linux 中安装 VMware Tools
  5. 原来蒋先生才是中国互联网启蒙第一人!
  6. apache如何加载系统环境变量_游学电子:windows10系统如何用cmd指令设置环境变量...
  7. android坐标计算器,函数科学计算器算坐标
  8. 全球与中国克罗米芬柠檬酸盐市场深度分析及发展趋向分析报告2022-2028年
  9. 第二十四章 SQL函数 CEILING
  10. 有限元剖网格之Gmsh安装与使用入门
  11. c++ 中的 LPCTSTR类型
  12. 使用Spring cloud框架完成中小信息化项目
  13. 详细的计算机存储层次结构图,必知必会-存储器层次结构
  14. 音视频技术开发周刊 79期
  15. 一年一度的食品饮料新消费盛会,FBNB2022首届新食力大会5月开幕
  16. Servlet 原来是这个玩意儿,看完恍然大悟 ~
  17. 企业如何保护浏览器安全?
  18. 手撕TreeMap红黑树
  19. 微信网页开发——JS-SDK接入以及微信二次分享图标和标题丢失
  20. 谢伏瞻:当前宏观经济形势与发展趋势

热门文章

  1. openstack及其核心组件
  2. 用户的眼睛没毛病!10 分钟搞明白如何在直播中解决黑屏、花屏、闪屏问题
  3. W ndows7怎么进入BlOS教程,windows7无法进入bios怎么办?win7开机的键盘无效进不了bios解决方法...
  4. GIF录屏/剪辑小工具screentogift、 免费截图贴图工具Snipaste
  5. fre740变频器参数_三菱FR-E740变频器简介7.doc
  6. 联想服务器做系统2018,联想小新潮7000 2018版(i5-8250U)如何用u盘装系统win8
  7. 2020电力计算机英语翻译,2020专八翻译50篇练习(一)
  8. 高德地图水波纹覆盖物+点击覆盖物切换弹窗显示与隐藏
  9. [Numpy] Numpy对于NaN值的判断
  10. 掘金量化:通过history方法获取数据,和新浪财经,雪球同用等比复权因子。不同于同花顺