leign

Contact: Email: leign.du@gmail.com MSN: dujiali1987@msn.cn
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

  • 随笔 - 12
  • 文章 - 12
  • 评论 - 8
  • 引用 - 0

常用链接

留言簿

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

[C++]有关函数重载
1、重载的充分的条件是在相同作用域下(如全局函数与成员函数)
2、当心隐式类型转换导致重载函数产生二义性当心隐式类型转换导致重载函数产生二义性
void func(float x);
void func(int x);

/* wrong */
func(
1.2);//自动转换类型

func(
float(1.2));
func(
int(1.2));
3、与覆盖、隐藏的区别

成员函数被重载的特征:

   1)相同的范围(在同一个类中);

   2)函数名字相同;

   3)参数不同;

   4)virtual关键字可有可无。

覆盖是指派生类函数覆盖基类函数,特征是:

   1)不同的范围(分别位于派生类与基类);

   2)函数名字相同;

   3)参数相同;

   4)基类函数必须有virtual关键字。

 1#include <iostream>
 2using namespace std;
 3class Base
 4{
 5public:
 6    void func(int x){ cout<<"Base::func(int)"<<endl; }
 7    void func(float x){ cout<<"Base::func(float)"<<endl; }
 8    virtual gg(int x){ cout<<"Base::gg(int)"<<endl; }
 9}
;
10class Derived:public Base
11{
12public:
13    virtual gg(int x){ cout<<"Derived::gg(int)"<<endl; }
14}
;
15
16int main()
17{
18    Derived d;
19    Base *b;
20    b=&d;
21
22    b->func(2);
23    b->func(2.1f);
24    b->gg(1);    //Derived::gg(int)
25
26    return 0;
27}

28
隐藏:
      1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

      2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

 1#include <iostream>
 2using namespace std;
 3class Base
 4{
 5public:
 6virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
 7void g(float x){ cout << "Base::g(float) " << x << endl; }
 8void h(float x){ cout << "Base::h(float) " << x << endl; }
 9}
;
10
11class Derived : public Base
12{
13public:
14virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }    //覆盖
15void g(int x){ cout << "Derived::g(int) " << x << endl; }    //非重载,隐藏
16void h(float x){ cout << "Derived::h(float) " << x << endl; }    //非重载,隐藏
17}
;
18
19int main()
20{
21    Derived a;
22    Base *b;
23    Derived *d;
24    b = &a;
25    d = &a;
26
27    b->f(2.1f);    //Derived::f(float) 2.1
28    d->f(2.1f);    //Derived::f(float) 2.1
29
30    //取决于指针类型
31    b->g(2.1f);    //Base::g(float) 2.1
32    d->g(2.1f);    //Derived::g(int) 2
33
34    //取决于指针类型
35    b->h(2.1f);    //Base::h(float) 2.1
36    d->h(2.1f);    //Derived::h(float) 2.1
37
38    return 0;
39}

posted on 2009-06-04 01:48 leign 阅读(136) 评论(0)  编辑 收藏 引用 所属分类: C++学习


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理