Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4567040
  • 博文数量: 385
  • 博客积分: 21208
  • 博客等级: 上将
  • 技术积分: 4393
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 13:40
文章分类

全部博文(385)

文章存档

2015年(1)

2014年(3)

2012年(16)

2011年(42)

2010年(1)

2009年(2)

2008年(34)

2007年(188)

2006年(110)

分类: C/C++

2006-11-14 16:04:31

重载与覆盖,隐藏 (zt)

重载与覆盖

成员函数被重载的特征:

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

(2)函数名字相同;

(3)参数不同;

(4)virtual关键字可有可无。

覆盖是指派生类函数覆盖基类函数,特征是:     用于多态

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

(2)函数名字相同;

(3)参数相同;

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



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

规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。

     此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。

     此时,基类的函数被隐藏(注意别与覆盖混淆)。



如下示例程序中:

(1)函数Derived::f(float)覆盖了Base::f(float)。

(2)函数Derived::g(int)隐藏了Base::g(float),而不是重载。

(3)函数Derived::h(float)隐藏了Base::h(float),而不是覆盖。

#include


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:publicBase{

public:

virtual void f(floatx){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;}

};

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);

阅读(2594) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~