阿布的天空,只做收集...                                                                                                    Manage    NewBlog    Exit


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

Welcome to iPUD's Sky!


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:阿布的天空
日志总数:29
评论数量:39
留言数量:-32
访问次数:165206
建立时间:2006年3月21日




[C++基础]重载、覆盖、多态与函数隐藏(1)
文章收藏,  软件技术

阿布 发表于 2006/3/28 15:49:27

经常看到C++的一些初学者对于重载、覆盖、多态与函数隐藏的模糊理解。在这里写一点自己的见解,希望能够C++初学者解惑。要弄清楚重载、覆盖、多态与函数隐藏之间的复杂且微妙关系之前,我们首先要来回顾一下重载覆盖等基本概念。首先,我们来看一个非常简单的例子,理解一下什么叫函数隐藏hide。 #include <iostream>using namespace std;class Base{public:    void fun() { cout << "Base::fun()" << endl; }};class Derive : public Base{public:    void fun(int i) { cout << "Derive::fun()" << endl; }};int main(){    Derive d;         //下面一句错误,故屏蔽掉    //d.fun();error C2660: 'fun' : function does not take 0 parameters    d.fun(1);         Derive *pd =new Derive();         //下面一句错误,故屏蔽掉         //pd->fun();error C2660: 'fun' : function does not take 0 parameters         pd->fun(1);         delete pd;    return 0;}/*在不同的非命名空间作用域里的函数不构成重载,子类和父类是不同的两个作用域。在本例中,两个函数在不同作用域中,故不够成重载,除非这个作用域是命名空间作用域。*/在这个例子中,函数不是重载overload,也不是覆盖override,而是隐藏hide。 接下来的5个例子具体说明一下什么叫隐藏 例1#include <iostream>using namespace std;class Basic{public:         void fun(){cout << "Base::fun()" << endl;}//overload         void fun(int i){cout << "Base::fun(int i)" << endl;}//overload};class Derive :public Basic{public:         void fun2(){cout << "Derive::fun2()" << endl;}}; int main(){         Derive d;          d.fun();//正确,派生类没有与基类同名函数声明,则基类中的所有同名重载函数都会作为候选函数。          d.fun(1);//正确,派生类没有与基类同名函数声明,则基类中的所有同名重载函数都会作为候选函数。         return 0;}  例2#include <iostream>using namespace std;class Basic{public:         void fun(){cout << "Base::fun()" << endl;}//overload         void fun(int i){cout << "Base::fun(int i)" << endl;}//overload};class Derive :public Basic{public:         //新的函数版本,基类所有的重载版本都被屏蔽,在这里,我们称之为函数隐藏hide     //派生类中有基类的同名函数的声明,则基类中的同名函数不会作为候选函数,即使基类有不同的参数表的多个版本的重载函数。         void fun(int i,int j){cout << "Derive::fun(int i,int j)" << endl;}         void fun2(){cout << "Derive::fun2()" << endl;} }; int main(){         Derive d;         d.fun(1,2);         //下面一句错误,故屏蔽掉         //d.fun();error C2660: 'fun' : function does not take 0 parameters         return 0;} 例3#include <iostream>using namespace std;class Basic{public:         void fun(){cout << "Base::fun()" << endl;}//overload         void fun(int i){cout << "Base::fun(int i)" << endl;}//overload};class Derive :public Basic{public:         //覆盖override基类的其中一个函数版本,同样基类所有的重载版本都被隐藏hide    //派生类中有基类的同名函数的声明,则基类中的同名函数不会作为候选函数,即使基类有不同的参数表的多个版本的重载函数。         void fun(){cout << "Derive::fun()" << endl;}         void fun2(){cout << "Derive::fun2()" << endl;}}; int main(){         Derive d;         d.fun();         //下面一句错误,故屏蔽掉         //d.fun(1);error C2660: 'fun' : function does not take 1 parameters         return 0;} 例4#include <iostream>using namespace std;class Basic{public:         void fun(){cout << "Base::fun()" << endl;}//overload         void fun(int i){cout << "Base::fun(int i)" << endl;}//overload};class Derive :public Basic{public:         using Basic::fun;         void fun(){cout << "Derive::fun()" << endl;}         void fun2(){cout << "Derive::fun2()" << endl;}};int main(){         Derive d;         d.fun();//正确         d.fun(1);//正确         return 0;}/* 输出结果Derive::fun()Base::fun(int i)Press any key to continue*/ 例5#include <iostream>using namespace std;class Basic{public:         void fun(){cout << "Base::fun()" << endl;}//overload         void fun(int i){cout << "Base::fun(int i)" << endl;}//overload};class Derive :public Basic{public:         using Basic::fun;         void fun(int i,int j){cout << "Derive::fun(int i,int j)" << endl;}         void fun2(){cout << "Derive::fun2()" << endl;}}; int main(){         Derive d;         d.fun();//正确         d.fun(1);//正确         d.fun(1,2);//正确         return 0;}/* 输出结果Base::fun()Base::fun(int i)Derive::fun(int i,int j)Press any key to continue*/


阅读全文(1173) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.063 second(s), page refreshed 144764017 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号