想要用好C++继承和类自身函数实现就必须了解C++得三个概念重定义(redefine)、重载(overload)、重写(override)。

一 基本感念

1 重定义(redefine)

派生类对基类函数得重定义,派生类函数名与基类某函数同名。

特点:

  1. 作用域不同,既一个在基类一个在子类中;
  2. 函数名相同;
  3. 参数列表、函数返回值无要求;

特殊情况:若派生类定义的函数与基类的成员函数完全一样(名字、参数列表、返回值),且基类的该函数为virtual,则属于派生类重写基类的虚函数。

2 重载(overload)

函数名相同,参数列表不同(参数类型、参数顺序),不能用返回值区分。

特点:

  1. 作用域相同;
  2. 函数名相同;
  3. 参数列表必须不同,但返回值无要求;

特殊情况:若某一重载版本的函数前面有virtual关键字修饰,则表示它是虚函数,但它也是重载的一个版本。

作用效果:编译器根据函数不同的参数列表,将函数与函数调用进行早绑定,重载与多态无关,与面向对象无关,它只是一种语言特性。

3 覆盖(override)

派生类重定义基类的虚函数,既会覆盖基类的虚函数(多态).

特点:

  1. 作用域不同;
  2. 函数名、参数列表、返回值相同;
  3. 基类函数是virtual;

特殊情况:若派生类重写函数是一个重载版本,那么基类的其他同名重载函数将在子类中隐藏。

作用效果:父类指针和引用指向子类的实例时,通过父类指针或引用可以调用子类的函数,这就是C++的多态。

多态是是使用虚函数表(vtable)技术来实现的,vtable技术就不详细介绍了,这个在学习C++多态的章节有很详细的描述。

二 代码实例

三个类,一个基类,两个派生类,类定义和实现如下:

 1 #include <iostream>
2
3 class Base
4 {
5 public:
6
7 // 三个重载函数
8 void fun()
9 {
10 std::cout << "base fun()" << std::endl;
11 }
12 void fun(int)
13 {
14 std::cout << "base fun(int)" << std::endl;
15 }
16
17 virtual void fun(int, double)
18 {
19 std::cout << "base fun(int,double)" << std::endl;
20 }
21
22 };
23
24 class Derive : public Base
25 {
26 public:
27 // 重定义基类fun函数,隐藏了基类的三个重载函数
28 void fun(double)
29 {
30 std::cout << "Drive fun(int)" << std::endl;
31 }
32 };
33
34 class Derive1:public Base
35 {
36 public:
37 // 重写基类的fun(int,double)函数,同时隐藏了基类的两个重载函数
38 void fun(int, double)
39 {
40 std::cout << "Derive1 fun(int,double)" << std::endl;
41 }
42 };

测试主程序:

int main(int argc, char* argv[])
{
// 测试重载
Base b;
b.fun(); //base fun()
b.fun(1); //base fun(int)
b.fun(1, 1.0); // base fun(int, double) // 测试重定义
Derive d;
//d.fun(1, 1.0); 编译报错
d.fun(1.0); //Drive fun(int) // 拷贝切片
Base b1 = d; // 用子类对象拷贝构造基类对象的过程会发生切片,既将子类不是父类的部分裁剪掉
b1.fun(); //base fun()
b1.fun(1); //base fun(int)
b1.fun(1, 1.0); // base fun(int, double)
b1.fun(1.0); // base fun(int) 函数的形参发生的隐式类型转换 // 测试重写
Base* p = new Derive1;
p->fun(1, 30.0); // Derive1 fun(int, double) getchar();
return 0;
}

详细的分析如注释。运行结果如下:

三 在C++11中可以指定不隐藏基类函数

在C++11中层架 了using的用法可以在子类中指定不隐藏基类的函数。

四 隐藏规则

隐藏规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。

C++ 重定义、重载、覆盖的更多相关文章

  1. 【C++】三大概念要分清--重载,隐藏(重定义,覆盖(重写)

    { c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)} 重载 •  概念:在同一个作用域内:函数名相同,参数列表不同(参数个数不同,或者参数类型不同,或者参数个数和参数类型都不同),返回值类 ...

  2. C++之重载覆盖和隐藏

    继承体系下同名成员函数的三种关系 重载 在同一作用域内 函数名相同,参数列表不同(分三种情况:参数个数不同,参数类型不同,参数个数和类型都不同) 返回值类型可以相同也可以不同 重写(覆盖) 在不同作用 ...

  3. 重载(overload)、重写:覆盖(override)、重定义:遮蔽(redefine)、多态

    同一域名空间,函数名相同,签名不同 编译期绑定确定绑定函数,也称为静态多态 重写:覆盖(override) 虚函数 子类空间,函数名相同,签名相同 重定义:遮蔽(redefine) 非虚函数,子类成员 ...

  4. c++ 重载,覆盖,重定义 2

    前一篇 http://www.cnblogs.com/iois/p/4085173.html 写有些地方不够准确,重新整理了一遍 函数重载(Function Overloading) C++允许同一范 ...

  5. c++ 重载,覆盖,重定义

    写的不是很明白,后来又重新整理过了,在: http://www.cnblogs.com/iois/p/4986790.html 函数重载(Function Overloading) C++允许同一范围 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 【原创】ACR傻瓜式破解IC芯片卡

    1.简介: 智能卡(英语:Smart card 或IC Card),又称智慧卡.聪明卡.集成电路卡及IC卡,是指粘贴或嵌有集成电路芯片的一种便携式卡片塑料.卡片包含了微处理器.I/O接口及存储器,提供 ...

  2. sdn交换机和普通交换机区别

    SDN交换机基本具有普通交换机的所有功能.SDN交换机特别的功能在于支持OpenFlow协议(有些只支持OpenFlow1.0,有些强点支持1.0和1.3).不过你要连接交换机再手动将所需的端口改成支 ...

  3. JAVA高级-面试题总结

    最近面试了一些公司,针对面试中遇到的问题在此记录,提升自己,造福大家 一.java源码相关 ArrayList创建和add等各种api使用原理 HashMap 的创建,put原理,和HashTable ...

  4. 微信小程序 获取用户信息授权

    login.wxml界面 获取用户授权可以用微信提供的接口 wx.authorize, 但是获取用户信息的授权用这个接口不会弹出授权窗口 <button class="submit-b ...

  5. format() expandtabs() 输入表格数据

    1 输入表格数据 format(self, *args, **kwargs): # known special case of str.format """ S.form ...

  6. UGUI学习——Canvas基础组件

    UGUI的分辨率自适应的机制 UGUI中,Canvas(画布)可以看成电脑屏幕,其功能和属性都是一样的.游戏中的分辨率自适应主要包括两部分: 1. 缩放适应:是在不同尺寸的屏幕下,整体缩放比例的计算方 ...

  7. 移动端调用ArcGIS Server 10.1服务

    1.最好用mdb数据源,不要用shp文件作为数据源,一是属性字段长度超过5个字符会被截断,二是中文会变成乱码. 2.mxd的layer的坐标系要是WGS1984(4362),不然属性查询不出来.

  8. vue 基础重要组件 模板指令 事件绑定

    组件:data methods watch new vue({ data:{ a:1, b:[] }, methods:{ dosomething:function(){ this.a++; } }, ...

  9. TIME_WAIT

    前言 请说说你对TCP连接中time_wait状态的理解 解答: 先上TCP的状态变迁图 1. time_wait状态如何产生? 由上面的变迁图,首先调用close()发起主动关闭的一方,在发送最后一 ...

  10. 【笔记】 laravel 的路由

    路由简介 : 请求对应着路由,将用户的请求转发给相应的程序进行处理 建立URL与程序之间的映射 Laravel中的请求类型:get.post.put.patch.delete   Route::get ...