函数重载:

1、相同的范围内(即同一类中)

2、函数名相同;

3、参数不同;

4、virtual关键字可有可无;

函数覆盖:虚函数的功能、动态多态

(父类中必须有virtual)========派生类函数 覆盖掉 基类函数;

指派生类中存在重新定义的函数,其函数名、参数、返回值类型必须同父类中相对应被覆盖的函数严格一致。覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同。

当派生类对象调用子类该同名函数会自动调用子类中的函数,而不是父类中的版本,这个机制就叫做覆盖;

1、不同的范围内(分别在 基类 和 派生类中)

2、函数名相同;

3、参数相同;

4、virtual关键字必须有;

隐藏:

隐藏是指派生类的函数屏蔽了与其同名的基类函数;

A、派生类的函数与基类的函数同名,但是参数不同。不论有无virtual,基类的函数将被隐藏;=======<区别: 重载>

B、派生类的函数与基类的函数同名,参数相同,必须没有virtual,基类的函数被隐藏;=========<区别:覆盖>

 #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; }
};

Derived::f(float x)覆盖Base::f(float x)  //不同范围,参数相同,函数名相同,有关键字virtual ----------覆盖

Derived::g(int  x)隐藏Base::g(float x)  //不同范围,参数不同,函数名相同,无关键字virtual----------隐藏

Derived::h(float x)隐藏Base::h(float x)  //不同范围,参数相同,函数名相同,但是无virtual-----------隐藏

 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时就加吧。

最新文章

  1. NLog在Asp.Net MVC的实战应用
  2. RX(一)
  3. iOS系统tabbar图标出现重影问题
  4. 什么是 JSON ?
  5. [转载]【基础篇】不为人知的Maya移动坐标轴
  6. Windows KB2984972安装后堵住了一个windows 7 桌面可以多个用户远程访问桌面的漏洞。
  7. Kooboo CMS 介绍
  8. Java Web应用启动间隔执行的程序
  9. xml写代码
  10. IOS 轻量级数据持久化 DataLite
  11. 成都IT公司面经及公司评价
  12. Java爬虫框架WebMagic——入门(爬取列表类网站文章)
  13. Dynamics CRM 部署NLB后使用群集名称访问弹验证框验证不过的解决方法
  14. Go语言基础(二)
  15. STS 安装SVN插件
  16. SQL记录-Oracle重命名表名例子
  17. POJ 3070 Fibonacci 【矩阵快速幂】
  18. Spring学习笔记--代理
  19. Windows7安装JDK的环境变量设置javac不是内部命令或外部命令
  20. linux中磁盘分区以及如何将磁盘挂载到系统中

热门文章

  1. 请求(Request)的参数(Parameter)里包含特殊字符(#等)的正确处理方式
  2. Adobe Acrobat 9 Pro Extended 9.4简体中文完整免激活注册版
  3. 解决android开发webservice的发布与数据库连接的问题
  4. hdu 1210_(逻辑训练)
  5. 基于eclipse的mybatis映射代码自动生成的插件
  6. asp.net MVC Razor 语法(2)
  7. (function(){}())写法的用途
  8. JavaScript中NODE操作学习总结
  9. Mybatis设置自增主键
  10. 详解new/delete(整合)