posts - 29, comments - 0, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          C++ 成員函數的重載、覆蓋與隱藏

          Posted on 2007-05-28 15:45 change 閱讀(181) 評論(0)  編輯  收藏

          摘自:《高質量的 C++編程》 

           

          8.2.1重載與覆蓋
              成員函數被重載的特征:
          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 <iostream.h>
              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 : public Base
          {
          public:
              virtual void f(float x){ 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); // Derived::h(float) 3.14
          }

           

          主站蜘蛛池模板: 保定市| 远安县| 深泽县| 湖南省| 拜泉县| 冀州市| 宁陵县| 班戈县| 包头市| 隆尧县| 页游| 图片| 遵化市| 霍城县| 凯里市| 江永县| 乐安县| 和顺县| 梁河县| 龙山县| 当阳市| 古交市| 施甸县| 靖宇县| 尖扎县| 独山县| 抚顺县| 荃湾区| 云梦县| 浪卡子县| 泸溪县| 武安市| 桐庐县| 吉首市| 铜川市| 云南省| 葵青区| 苏尼特右旗| 会同县| 中山市| 湖南省|