当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

谈C++继承中的重载、覆盖和隐藏

      写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide)。在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的,他们是英语专业的),常常把重载(overload)和覆盖(override)搞错!

      我们先来看一些代码及其编译结果。

      实例一:    

        #include "stdafx.h"
        #include
      class CB
        {
        public:
           void f(int)

           {
              cout << "CB::f(int)" << endl;
           }
      };  

      class CD : public CB
        {
        public:
           void f(int,int)
           {
             cout << "CD::f(int,int)" << endl;
           }
           void test()
           {
            f(1);
           }
        }; 

       int main(int argc, char* argv[])
       {
          return 0;
       }
      编译了一下
      error C2660: 'f' : function does not take 1 parameters

      结论:在类CD这个域中,没有f(int)这样的函数,基类中的void f(int)被隐藏

      如果把派生CD中成员函数void f(int,int)的声明改成和基类中一样,即f(int),基类中的void f(int)还是一样被覆盖,此时编译不会出错,在函数中test调用的是CD中的f(int) 

      所以,在基类中的某些函数,如果没有virtral关键字,函数名是f(参数是什么我们不管),那么如果在派生类CD中也声明了某个f成员函数,那么在类CD域中,基类中所有的那些f都被隐藏。

      如果你比较心急,想知道什么是隐藏,看文章最后的简单说明,不过我建议你还是一步一步看下去。

      我们刚才说的是没有virtual的情况,如果有virtual的情况呢??

      实例二:  

      #include "stdafx.h"
      #include  
      class CB
      {
      public:
         virtual void f(int)
         {
           cout << "CB::f(int)" << endl;
         }  

      };  

      class CD : public CB
      {
      public:
         void f(int)
         {
           cout << "CD::f(int)" << endl;
         }  

      };  
      int main(int argc, char* argv[])
      {
        return 0;
      }
      这么写当然是没问题了,在这里我不多费口舌了,这是很简单的,多态,虚函数,然后什么指向基类的指针指向派生类对象阿,通过引用调用虚函数阿什么的,属性多的很咯,什么??你不明白??随便找本C++的书,对会讲多态和虚函数机制的哦!!

 

共3页 首页 上一页 1 2 3 下一页 尾页 跳转到
相关内容
赞助商链接