返回首页
当前位置: 主页 > 编程语言 > C/C++教程 >

探索C++的秘密之二:重载,覆盖,和隐藏

时间:2014-02-26 22:53来源:电脑教程学习网 www.etwiki.cn 编辑:admin

这几个概念都有一个共同点:函数名称相同,所以不免让人混淆,大致的区别如下:

重载(overload):
必须在一个域中,函数名称相同但是函数参数不同,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数是无法构成重载的,这个是重载的重要特征

覆盖(override):
覆盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数,既然是和虚拟函数挂钩,说明了这个是一个多态支持的特性,所谓的覆盖指的是用基类对象的指针或者引用时访问虚拟函数的时候会根据实际的类型决定所调用的函数,因此此时派生类的成员函数可以"覆盖"掉基类的成员函数.
注意唯有同名且参数相同还有带有virtual关键字并且分别在派生类和基类的函数才能构成虚拟函数,这个也是派生类的重要特征.
而且,由于是和多态挂钩的,所以只有在使用类对象指针或者引用的时候才能使用上.
总之一句话:覆盖函数都是虚函数,反之不然~~

隐藏(hide):
指的是派生类的成员函数隐藏了基类函数的成员函数.隐藏一词可以这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了那么就停止查找了,所以如果一个派生类和一个基类都有同一个同名(暂且不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那么我们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义....
回到隐藏的定义中,前面已经说了有virtual关键字并且分别位于派生类和基类的同名,同参数函数构成覆盖的关系,因此隐藏的关系只有如下的可能:
1)必须分别位于派生类和基类中
2)必须同名
3)参数不同的时候本身已经不构成覆盖关系了,所以此时是否是virtual函数已经不重要了
当参数相同的时候就要看时候有virtual关键字了,有的话就是覆盖关系,没有的时候就是隐藏关系了

上面的解说大体把三者的区别给说清楚了,但是还有一些疑惑的地方,以下以代码例子说明.

很多人分辨不清隐藏和覆盖的区别,因为他们都是发生在基类和派生类之中的.但是它们之间最为重要的区别就是:
覆盖的函数是多态的,是存在于vtbl之中的函数才能构成"覆盖"的关系,而隐藏的函数都是一般的函数,不支持多态,在编译阶段就已经确定下来了.


class Base
{
public :
virtual void f( float x) {cout << " Base::f(folat) " << x << endl;}
void g( float x) {cout << " Base::g(float) " << x << endl;}
}
;

class Derived: public Base
{
public :
virtual void f( float x) {cout << " Derived::f(float) " << x << endl;}
void g( int x) {cout << " Deriver::g(int) " << x << endl;}
}
;

int main()
{
Derived d;
Base
* pb =& d;
Derived
* pd =& d;
pb
-> f( 3.14f );
pd
-> f( 3.14f );
pb
-> g( 3.14f ); // 输出结果:Base::g(float)3.14
pd -> g( 3.14f ); // 输出结果:Dervied::g(int)3
return 0 ;
}


顶一下
(1)
100%
踩一下
(0)
0%
标签(Tag):C语言
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐内容