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

文章作者 100test 发表时间 2007:03:10 16:48:36
来源 100Test.Com百考试题网


写正题之前,先给出几个关键字的中英文对照,重载(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的情况呢??

相关文章


全国计算机等级考试二级C语言上机题21-30
二级共公基础知识教程第2章下
C 中接口与实现分离的技术
二级共公基础知识教程第2章
谈C 继承中的重载、覆盖和隐藏
南开100题最后一部分
全国计算机等级考试二级公共基础知识课后习题及答案4
南开100题答案第三部分
C 箴言:为类型信息使用特征类
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛