C++中覆盖,重载和隐藏 .

转载 2013年12月04日 09:44:56

#include <iostream>

using namespace std;

struct foo

{

       void func(int x) {

              cout <<"foo::func(int)"<<endl;

       }

       void func(float x) {

              cout <<"foo::func(float)"<<endl;

       }

       void func(double x) {

              cout <<"foo::func(double)"<<endl;

       }

};

 

struct a

{

       void func(int x) {

              cout <<"struct a :: fun(int x)"<<endl;

       }

};

struct b : public a

{

       void func(float x) {

              cout <<"struct b::fun(float x)"<<endl;

       }

};

struct c : public b

{

       //using a::func;

       //using b::func;

       void func(double x) {

              cout <<"struct c::func(double x)"<<endl;

       }

};

 

int main()

{

       foo  fo;

       fo.func(1);

       fo.func((float)1);

 

       c  oc;

       oc.func(1);

       oc.func((float)1);

}

   运行结果是:

foo::func(int)

foo::func(float)

struct c::func(double x)

struct c::func(double x)

 

说明前面是重载,而后面则完全被覆盖了, C++中有一条规则:派生类和基类是处于不同的两个名字空间中。因此,拆开后的代码应该不算是重载。如果要进行重载,需要 using 声明:

struct c: public a {   using a::func;

using b::func;   void func(double x){  } };

 

那么,如果不用 using 声明,拆分后代码中的函数 func 不是重载应该是什么呢?是隐藏(hide)。下面是关于重载、覆盖和隐藏的区别: 这几个概念都有一个共同点:函数名称相同,所以不免让人混淆,大致的区别如下: 重载(overload): 必须在一个域中,函数名称相同但是函数参数不同,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数是无法构成重载的,这个是重载的重要特征覆盖(override): 盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数,既然是和虚拟函数挂钩,说明了这个是一个多态支持的特性,所谓的覆盖指的是用基类对象的指针或者引用时访问虚拟函数的时候会根据实际的类型决定所调用的函数,因此此时派生类的成员函数可以"覆盖"掉基类的成员函数. 注意唯有同名且参数相同还有带有virtual关键字并且分别在派生类和基类的函数才能构成虚拟函数,这个也是派生类的重要特征. 而且,由于是和多态挂钩的,所以只有在使用类对象指针或者引用的时候才能使用上. 总之一句话:覆盖函数都是虚函数,反之不然~~ (如果基类和继承类的函数名称,产生返回值都是一样的[如果返回值不同应该无法编译],如果基类用到了virtual,那么无论继承类的实现中是否加入virtual 这个keyword ,还是会构成 override 的关系) 隐藏(hide): 的是派生类的成员函数隐藏了基类函数的成员函数.隐藏一词可以这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定,如果找到了那么就停止查找了,所以如果一个派生类和一个基类都有同一个同名(暂且不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,么我们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义.... 回到隐藏的定义中,前面已经说了有virtual关键字并且分别位于派生类和基类的同名,同参数函数构成覆盖的关系,因此隐藏的关系只有如下的可能: 1)必须分别位于派生类和基类中 2)必须同名 3)参数不同的时候本身已经不构成覆盖关系了,所以此时是否是virtual函数已经不重要了当参数相同的时候就要看时候有virtual关键字了,有的话就是覆盖关系,没有的时候就是隐藏关系了很多人分辨不清隐藏和覆盖的区别,因为他们都是发生在基类和派生类之中的.但是它们之间最为重要的区别就是: 覆盖的函数是多态的,是存在于vtbl之中的函数才能构成"覆盖"的关系,而隐藏的函数都是一般的函数,不支持多态,在编译阶段就已经确定下来了.

相关文章推荐

C++ 封装、继承、多态、重载、覆盖、隐藏基本概念详解

一、面向对象的三个基本特征 (1)封装   也就是把客观事物封装为抽象的类,并且类可以把自己的数据和方法只让可信的对象或者类进行操作,不可信的类进行隐藏。 (2)继承  就是可以使用现有类的所有功能,...

C++ 重载 覆盖 隐藏

成员函数的重载、覆盖与隐藏 成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚 概念,否则错误将防不胜防。 8.2.1 重载与覆盖 成员函数被重载的特征: (...

c++(重载、覆盖、隐藏) (3)

函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题 1、声明/定义重载函数时,是如何...

c++(重载、覆盖、隐藏) (1)

成员函数的重载、覆盖与隐藏 成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚 概念,否则错误将防不胜防。 8.2.1 重载与覆盖 成员函数被重载的特征: (...

C++中的覆盖、重载与隐藏

c++中类本身之间的函数关系与基类和子类之间的函数关系有:覆盖、重载与隐藏。 1>覆盖:C++中在基类用virtual定义的函数在子类中重新定义,此时称为覆盖,即子类对父类函数的覆盖。 2>重载:...

C++中重载、重写(覆盖)和隐藏的区别实例分析

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

C++父子类继承时的隐藏、覆盖、重载

存在父子类继承关系时,若有同名成员函数同时存在,会发生隐藏、覆盖和重载这几种情况。对于初学者也比较容易混淆,为此,我整理了一下我的个人看法,仅供参考。希望对大家理解有帮助,也欢迎指正。 1.父子...

C++中谈重载、覆盖、和隐藏

在学习C++的时候,在了解到多态类(存在虚函数的类)的时候我知道了有关对象模型的概念,在剖析了有关对象模型的知识后,对于其中的派生类继承一个多态基类的时候,会对父类的虚函数进行重写,重写也就是所谓的覆...

C++中重载、重写(覆盖)和隐藏的区别实例分析

http://www.jb51.net/article/54225.htm 这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可...

C++重载、覆盖与隐藏

重载 前提:(1)同一作用域 (2)函数名相同 要求:不同形参表 注: 返回类型和参数的缺省值不参与重载识别。函数前缀的访问控制(public/protected/p...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)