1.重载overload:函数名相同,参数列表不同。 重载只是在类的内部存在,或者同为全局范围。(同名,同参函数返回值不同时,会编译出错。因为系统无法知晓你到底要调用哪一个。)
 
2.重写override:也叫做覆盖子类重新定义父类中同名、同参的虚函数。函数特征相同。但是具体实现不同,主要是在继承关系中出现的 。
    重写需要注意:
    a 被重写的函数不能是static的。必须是virtual的
    b 重写函数必须有相同的类型,名称和参数列表
    c 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public,protected也是可以的。(因为已经重写了,所以不违背保密性和安全性。)
 

3.重定义 (redefining):

子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。

4.隐藏

如果一个类,存在和父类同名的函数,那么无论继承还是重定义,父类的同名函数都会被隐藏。
 
//
// main.cpp
// TestOveride
//
// Created by New_Life on 2017/4/26.
// Copyright © 2017年 chenhuan001. All rights reserved.
// #include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std; class A {
public:
void overload_print(int a) {//
cout << "overload A: a" << endl;
} void overload_print(int a, int b) {// 2,重载1
cout << "overload A: a , b" << endl;
} /* 编译错误,不能出现重载
* Functions that differ only in their return type cannot be overloaded
* overload_print(1) 的时候,谁知道你调用的什么。
int overload_print(int a) {
return 1;
}
*/ /* 编译错误,static 与 virtual 定义冲突
* 虚函数只能出现在no-static中
* 'virtual' can only appear on non-static member functions
static virtual void virtual_print() {
cout << "virtual A: " << endl;
}
*/ void redefine_print() {//
cout << "redefine A: " << endl;
} // -------------- Test hidden ----------------//
void hidden_print() {
cout << "hidden A:" << endl;
} void hidden_print(int a) {
cout << "hidden A: a" << endl;
} private:
virtual void override_print() {//
cout << "override A: " << endl;
} void redefine_print(int a) {//
cout << "redefine priavte A: a" << endl;
}
}; class B : public A {
public:
void override_print() { //重写(覆盖)了4, private -> public,其实可以看出是一个新的。
cout << "override B: " << endl;
} void redefine_print() {//重定义 3
cout << "redefine B: " << endl;
} void redefine_print(int a) {//重定义 5, 说明父类为private的函数也能重定义,也可以看出一个新的。
cout << "redefine B: a" << endl;
} // ------------- Test hidden -----------------//
void hidden_print(int a, int b) {
cout << "hidden B: a, b" << endl;
}
}; int main(int argc, const char * argv[]) {
B b;
b.overload_print(, ); //打印 重载 b.override_print(); //打印 重写 b.redefine_print(); //打印重定义
b.redefine_print(); //打印重定义,private /* 编译错误,因为这两个父类的函数,因为同名被隐藏了。使用b.A::hidden_print(), b.A::hidden_print(1)即可
* Too few arguments to function call, expected 2, have 0; did you mean 'A::hidden_print'?
b.hidden_print();
b.hidden_print(1);
*/
b.hidden_print(, );
return ;
}

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++ 学习笔记 (八)重载 重写 重定义以及名字覆盖

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

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

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

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

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

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

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

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

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

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

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

  10. C++中重载、重定义、重写概念辨析

    重载:函数名相同,函数的参数个数.参数类型或参数顺序三者中必须至少有一种不同.函数返回值的类型可以相同,也可以不相同.发生在一个类内部. 重定义:也叫做隐藏.覆盖,子类重新定义父类中有相同名称的非虚函 ...

随机推荐

  1. Java 加载配置文件的方式

    一 使用原生方式读取配置文件 1 文件系统加载 Java代码   InputStream in = new FileInputStream("config.properties") ...

  2. 数据库——SQL中EXISTS怎么用3(转)

    有一个查询如下: 1 SELECT c.CustomerId, CompanyName   2 FROM Customers c   3 WHERE EXISTS(   4     SELECT Or ...

  3. Android基础工具类重构系列一Toast

    前言: 一直在考虑写一下Android实际项目中的一些总结,翻看CSDN博客,上一篇已经是一年多曾经. 本系列定位Android基础工具类重构.旨在记录实际项目中经经常使用到的一些工具类,比方Toas ...

  4. iOS彩票项目--第六天,运用MVC思想搭建设置界面(非storyboard方法)

    一.我只想说封装的思想很重要,MVC的思想也很重要,利用MVC思想搭建一下的界面 先说显示出来的cell,有三种(图中的两种,还有一种是最普通的,没有图片的),这种显示不同的cell,交给模型来处理, ...

  5. 【转】 web 测试使用的chrome插件

    1.二维码插件 https://chrome.google.com/webstore/detail/%E4%BA%8C%E7%BB%B4%E7%A0%81qr%E7%A0%81%E7%94%9F%E6 ...

  6. [mysql] mysql-myibatis-整理

    ==================================== insert ========================================== 语句1 <inser ...

  7. USB2.0学习笔记连载(三):通用USB驱动程序解析

    对于USB驱动的开发,读者可以使用Windows DDK.DriverStudio等多种开发工具来实现USB的驱动,但是驱动程序的开发过程都比较复杂,而且很容易致使USB主机内存泄露而死机.那么对于笔 ...

  8. Latex的各种帽子

    \hat{A} \widehat{A} \tilde{A} \widetilde{A} \overline{A} \underline{A} \overbrace{A} \underbrace{A} ...

  9. Linux ad7606 驱动

    Linux中已经移植好了ad7606,位于driver/staging/iio/adc/目录中.只要在板级文件中添加device中即可. 移植参考文档: https://wiki.analog.com ...

  10. (转)引用---FFMPEG解码过程

    视频播放过程 首先简单介绍以下视频文件的相关知识.我们平时看到的视频文件有许多格式,比如 avi, mkv, rmvb, mov, mp4等等,这些被称为容器(Container), 不同的容器格式规 ...