学习C++必定会遇到重载、重写、重定义。概念的东西多也是学习C++蛋疼之处,但是还是得弄懂,学懂了也就不觉得多了。

  

  概念,特点:

  

  重载:

    直白点说就是函数名字相同,传参的个数,类型不一样。判断标准在于传参是否相同。它有以下的特点:

    1.重载只发生在同一类中。

    2.子类不能重载父类的函数

    3.在程序编译期间,编译器将

  

  重写:

    1.发生在子类和父类之间

    2.子类虚继承(使用了virtual关键字)父类的同名函数,并且原型相同

  

  重定义:

    与重写唯一不同的在于没有使用virtual关键字  

  

  名称覆盖在后面的例程说明中进行解析。

  

  本次笔记通过以下两个类为例子说明:

  parent :                     child:

  void abc();                 void abc();

 virtual void func()              virtual void func(int i)
                         virtual void func(int i, int j)             
 class Parent
{
public:
void abc()
{
printf("abc");
} virtual void func()
{
cout<<"func() do..."<<endl;
} }; class Child : public Parent
{ public:
void abc()
{
printf("child abc");
} virtual void func(int i)
{
cout<<"func(int i) do..."<<i<< " "<<j<<endl;
}
virtual void func(int i, int j, int k)
{
cout<<"func(int i, int j) do.."<< endl;
} };

    例程说明:

  父类定义了两个函数:abc 和 func

  1.子类中的abc与父类abc有相同原型,没有使用virtual关键字,属于重定义

  2.假如父类中的函数abc 声明为    virtual void abc();   那么子类则是重写函数abc

 

  3.子类的func函数定义了两个传参不同的func函数,这两个函数属于重载

  

  4.名字覆盖

  在main函数中执行以下代码:

    Child c;

    c.func();

  4.1.将会提示:无法重载父类函数。编译失败。

  4.2.在继承中子类可以调用父类的公有函数,在这里因为在子类已经有了名字为func的函数(传参不同),那么编译器会认为这是子类在重载父类的函数,在上面的概念特点描述中第一点                 已经说明重载只发生在同一类中,所以重载失败

  4.3.不能直接调用父类函数是因为,子类有同名的函数,这就名字覆盖。

  4.4.这种情况下如果仍要调用父类的func函数可以通过作用域符号进行解决:

    c.Parent::func();

C++ 学习笔记 (八)重载 重写 重定义以及名字覆盖的更多相关文章

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

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

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

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

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

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

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

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

  5. Java IO学习笔记八:Netty入门

    作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...

  6. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  7. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  8. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  9. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

随机推荐

  1. POJ1022 Packing Unit 4D Cubes

    题目来源:http://poj.org/problem?id=1022 题目大意: 有一些4维的单位体积的立方体盒子,每个立方体有8个面.要用一个大的4为盒子将它们包起来,求最小的大盒子体积. 输入: ...

  2. Proxy模式(代理[延迟]模式)

    Proxy?? Proxy是"代理人"的意思,它指的是代替别人进行工作的人.代理实际上就是使用委托的机制,在代理的过程中你可以做点其他的事情,然后再来执行被代理对象的代码. 知识储 ...

  3. Angular2.0的学习(四)

    第四节课:数据绑定.响应式编程和管道 1.数据绑定(插值表达式.事件绑定.属性绑定.双向绑定) 2.响应式编程 3.管道

  4. BeanFilterUtil

    package com.yundaex.utility.bean.filter; import java.util.ArrayList; import java.util.List; import o ...

  5. @RequestBody注解的用法

    以前,一直以为在SpringMVC环境中,@RequestBody接收的是一个Json对象,一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是一 ...

  6. 【ACM】吝啬的国度 - DFS (图)

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...

  7. Java文件与io——字节流

    FileOutputStream用于写入诸如图像数据之类的原始字节的流 字节输出流:OutputStream 此抽象类表示输出字节流的所有类的超类.(写) 字节输入流:InputStream(读) p ...

  8. arch搭建SVN服务器

    一.安装 Install the package Install subversion from the official repositories. Create a repository Crea ...

  9. mac-httpd

    mac 的httpd mac 自带了apache2, 但是不推荐使用, 因为它的目录在/Library/WebServer/Documents/下 使用brew install apache-http ...

  10. Quartz.NET持久化

    Quartz.NET所用到的数据库表结构 官方提供的各种数据库脚本:https://github.com/quartznet/quartznet/tree/master/database/tables ...