C++ 的重载(overload),重写(override), 重定义(redefining/hide)
来源:互联网 发布:有认识淘宝小二的吗 编辑:程序博客网 时间:2024/05/16 08:34
一、重载(overload)
实现重载要求函数名相同,但是参数表列 个数或顺序,类型不同。注意 不能通过返回类型来重载。
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
实现重载要求函数名相同,但是参数表列 个数或顺序,类型不同。注意 不能通过返回类型来重载。
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
(5)返回值可以不同;
二、重写(也称覆盖 override)
指在派生类中重新定义基类的虚函数,特征是:
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同(或是协变),否则报错;<—-协变这个概念我也是第一次才知道…
(6)重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的
三、重定义(也成隐藏)
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆) 。
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) 。
下面通过一个demo 来加深理解:
#include<iostream>class A {public: void Func1(int a) { std::cout << "class A: Func1" << std::endl; } virtual void Func2(int a) { std::cout << "class A: Func2" << std::endl; } virtual void Func3(int a) { std::cout << "class A: Func3" << std::endl; }};class B : public A {public: // redefining void Func1(int a) { std::cout << "class B: Func1" << std::endl; } // override void Func2(int a) { std::cout << "class B: Func2-1" << std::endl; } // overload void Func2(int a, int b) { std::cout << "class B: Func2-2" << std::endl; } // redefining void Func3(char a) { std::cout << "class B: Func3" << std::endl; }};int main(int argc, char* argv[]){ B* b = new B; b->Func1(1); b->Func2(1); //verify override b->Func2(1, 1); // verify overload b->Func3(1); //verify redifining with different params std::cout<<"Point A"<<std::endl; A* a = new B; a->Func1(1); a->Func2(1); //a->Func2(1, 1); a->Func3('x'); return 0;}
参考:
http://glgjing.github.io/blog/2014/12/27/c-plus-plus-zhong-zai-,-zhong-xie-,-zhong-ding-yi-qu-bie/
http://www.cnblogs.com/tanky_woo/archive/2012/02/08/2343203.html
http://blog.csdn.net/yiya1989/article/details/17230867
阅读全文
0 0
- C++ 的重载(overload),重写(override), 重定义(redefining/hide)
- 重载(overload)、重写(override)、重定义(redefining)
- C++函数重定义(redefining)、重载(overload)、重写 (override)
- C++类中重载(overload)/覆盖(override)/重定义(redefining)
- 重载(overLoad),重写(overRide),隐藏(hide)
- C++中重载(overload)、重写(override,也叫做“覆盖”)和重定义(redefine)的区别?
- Overload(重载)Override(重写)
- C++系列——重载(overload),重写(override),重定义(redefine)
- C++重写(override)、重载(overload)、重定义(redefine)以及虚函数调用机制【个人总结】
- 一张图让你明白C++的重载(overload),重写(override)与重定义(redefine)
- 【C#】重载(overload)与重写(override)
- 重载(Overload)与重写(Override)
- Overload(重载)和Override(重写)
- 重载(Overload)与重写(Override)
- Override和Overload(重写和重载)
- C# 重载(overload)与重写(override)
- override(重写)与overload(重载)的区别
- C++的重载(overload)与重写(override)
- 【POJ 3401】Asteroids
- Openstack中虚拟机一些性能评价指标
- 用Swing开发GUI程序(二)JFrame和JDialog
- 深度学习之基础(一)
- Genymotion安装问题
- C++ 的重载(overload),重写(override), 重定义(redefining/hide)
- 专利局的数字证书要备份好!!
- PostgreSQL postgre sql 的一些特性
- kafka-spark streaming-hbase
- 关于部分小米手机使用Instant Run 的Installation failed with message Failed to establish session问题
- java断言
- 如是使用JS实现页面内容随机显示
- spring mvc配置 + dbcp数据源+jdbcTemplate
- 科普:什么是TLS1.3