博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重载(overload)、覆盖(override)、隐藏(hide)的区别
阅读量:6607 次
发布时间:2019-06-24

本文共 1763 字,大约阅读时间需要 5 分钟。

谈谈重载(overload)覆盖(override)与隐藏

转自http://blog.csdn.net/yanjun_1982/archive/2005/09/02/470405.aspx

这三个概念都是与OO中的多态有关系的。如果单是区别重载与覆盖这两个概念是比较容易的,但是隐藏这一概念却使问题变得有点复杂了,下面说说它们的区别吧。   重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。   覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。   隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了。隐藏与另外两个概念表面上看来很像,很难区分,其实他们的关键区别就是在多态的实现上。什么叫多态?简单地说就是一个接口,多种实现吧。   还是引用一下别人的代码来说明问题吧(引用自林锐的《高质量C/C++编程指南》)。

仔细看下面的代码:

#include <iostream.h>
class Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(float) " << x << endl; }
};
class Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
void g(int x){ cout << "Derived::g(int) " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};
看出什么了吗?下面说明一下:
(1)函数Derived::f(float)覆盖了Base::f(float)。
(2)函数Derived::g(int)隐藏了Base::g(float),而不是重载。
(3)函数Derived::h(float)隐藏了Base::h(float),而不是覆盖。

嗯,概念大概明白了,但是在实际的编程中,我们会因此遇到什么问题呢?再看下面的代码:

void main(void)

{
Derived d;
Base pb = &d;
Derived
pd = &d;

// Good : behavior depends solely on type of the object

pb->f(3.14f); // Derived::f(float) 3.14
pd->f(3.14f); // Derived::f(float) 3.14

// Bad : behavior depends on type of the pointer

pb->g(3.14f); // Base::g(float) 3.14
pd->g(3.14f); // Derived::g(int) 3 (surprise!)

// Bad : behavior depends on type of the pointer

pb->h(3.14f); // Base::h(float) 3.14 (surprise!)
pd->h(3.14f); // Derived::h(float) 3.14
}
在第一种调用中,函数的行为取决于指针所指向的对象。在第二第三种调用中,函数的行为取决于指针的类型。所以说,隐藏破坏了面向对象编程中多态这一特性,会使得OOP人员产生混乱。
不过隐藏也并不是一无是处,它可以帮助编程人员在编译时期找出一些错误的调用。但我觉得还是应该尽量使用隐藏这一些特性,该加virtual时就加吧。

转载于:https://blog.51cto.com/norman20000/2369224

你可能感兴趣的文章
java异常体系结构详解
查看>>
猜猜几种c#字符串连接所消耗时间的先后?
查看>>
BarTender中如何调整数据输入表单的大小?
查看>>
JDK环境变量中dt.jar、tools.jar等变量值的作用
查看>>
java valueOf
查看>>
jq对页面元素进行排序
查看>>
深入理解PHP内核(十二)函数-函数的定义、传参及返回值
查看>>
GUI应用程序架构的十年变迁:MVC,MVP,MVVM,Unidirectional,Clean
查看>>
nginx location配置详细解释
查看>>
WPF中的容器控件——DockPanel
查看>>
2019-05-11 Jave学习日记之进制运算&数据类型
查看>>
element-ui(vue)upload组件的http-request方法的使用
查看>>
Office 2003 2007 2010 配置进度 正在配置 解决方案 (转载)
查看>>
linux下查看cpu的信息
查看>>
昨晚企业文化培训有感
查看>>
Android Ap 开发 设计模式第九篇:桥接模式
查看>>
Python里的17个“骚操作”好玩有趣
查看>>
web与tomcat服务器集成问题汇总
查看>>
salt之自定义模块
查看>>
CentOS 6.4x64 yum 源服务器配置
查看>>