这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下

本文实例讲述了C++中重载、重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念。具体分析如下:

1.重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。

示例代码如下:

class A{
public:
void test(int i);
void test(double i);
void test(int i, double j);
void test(double i, int j);
int test(int i); //错误,非重载
};

前四个互为重载函数,最后一个和第一个不是重载函数,重载函数最重要的两点,函数名相同,参数不同。

2.隐藏:隐藏是指派生类的函数屏蔽了与其同名的基类函数。注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。

实例代码如下:

#include<iostream>
using namespace std;
class A{
public:
void fun1(int i, int j){
cout << "A::fun1() : " << i << " " << j << endl;
} };
class B : public A{
public:
//隐藏
void fun1(double i){
cout << "B::fun1() : " << i << endl;
}
};
int main(){
B b;
b.fun1(5); //调用B类中的函数
b.fun1(1, 2); //出错,因为基类函数被隐藏
system("pause");
return 0;
}

3.重写:重写翻译自override,也翻译成覆盖(更好一点),是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。

实例代码如下:

#include<iostream>
using namespace std;
class A{
public:
virtual void fun3(int i){
cout << "A::fun3() : " << i << endl;
} };
class B : public A{
public:
//重写
virtual void fun3(double i){
cout << "B::fun3() : " << i << endl;
}
};
int main(){
A a;
B b;
A * pa = &a;
pa->fun3(3);
pa = &b;
pa->fun3(5);
system("pause");
return 0;
}

上面为虚函数实现多态的代码,不明白的先看虚函数实现多态的原理。

重载和重写的区别:

(1)范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。

(2)参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。

(3)virtual的区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有。

隐藏和重写,重载的区别:

(1)与重载范围不同:隐藏函数和被隐藏函数在不同类中。

(2)参数的区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定同;当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,而不是被重写。

调试运行如下代码:

#include<iostream>
using namespace std;
class A{
public:
void fun1(int i, int j){
cout << "A::fun1() : " << i << " " << j << endl;
}
void fun2(int i){
cout << "A::fun2() : " << i << endl;
}
virtual void fun3(int i){
cout << "A::fun3(int) : " << i << endl;
}
};
class B : public A{
public:
//隐藏
void fun1(double i){
cout << "B::fun1() : " << i << endl;
}
//重写
void fun3(int i){
cout << "B::fun3(int) : " << i << endl;
}
//隐藏
void fun3(double i){
cout << "B::fun3(double) : " << i << endl;
}
};
int main(){
B b;
A * pa = &b;
B * pb = &b;
pa->fun3(3); //重写,多态性,调用B的函数
b.fun3(10); //隐藏,调用B的函数
pb->fun3(20); //隐藏,调用B的函数
system("pause");
return 0;
}

输出结果为:

B::fun3(int) : 3
B::fun3(int) : 10
B::fun3(int) : 20
请按任意键继续. . .

希望本文所述对大家C++面向对象程序设计有所帮助。

最新文章

  1. 把域名绑定到某个项目,以nginx服务器为例
  2. UILabel 设置行间距
  3. Hibernate —— Session
  4. 关闭英文拼写检查,关闭xml验证
  5. Python之路第一课Day3--随堂笔记(文件操作)
  6. idea 清除svn登陆权限信息
  7. docker创建镜像的几个命令
  8. 创建XML
  9. boot.img的分析
  10. Android问题-No resource found that matches the given name (at &#39;theme&#39; with value &#39;@style/CaptureTheme&#39;).
  11. 一个不错的php图片处理类EasyPhpThumbnail Class
  12. Oracle JDBC通过占位符可以查询可变长字段,不可查询固定长度字段
  13. android开发之手势识别
  14. .net框架介绍
  15. LCS最大公共子序列问题
  16. PAT (Advanced Level) 1065. A+B and C (64bit) (20)
  17. Java:reflection
  18. 转:【Java并发编程】之十:使用wait/notify/notifyAll实现线程间通信的几点重要说明
  19. Java进阶(四)Java反射TypeToken解决泛型运行时类型擦除问题
  20. cocos2dx-lua调用C++

热门文章

  1. Android 4.4 Kitkat 使能 USB adb 功能
  2. android 实现静默安装、卸载
  3. 纯CSS3编写的面包屑导航收集
  4. ISG2015
  5. JS(移动端)自己封装移动端一些常用方法
  6. 使用CSS3 Media Queries实现网页自适应(转)
  7. 前端自动化学习笔记(一)——Yeoman,bower,Grunt的安装
  8. UVA 10410 Tree Reconstruction
  9. AjaxHelper学习,ajax,microsoft,mvc,asp.net
  10. .net 生成缩略图