免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1254 | 回复: 7
打印 上一主题 下一主题

讨论继承里的重载问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-05 15:17 |只看该作者 |倒序浏览
我现在遇到这样一个问题。假设A类里面有2个方法 f(int),f()。 现在B类公有的继承A类,正常情况下B类里面已经有了A类的方法,我们可以这样使用A
A a;
a.f();
a.f(6);

但是如果我在B里面重载f(),例如我加了一个f(char),这个时候,B就不能使用A里的f()方法了。就会产生编译错误。说没有匹配的方法,这是为什么,是C++的一个限制吗?

A a;
a.f('c');
a.f(6); //ERROR
a.f()   //ERROR

论坛徽章:
0
2 [报告]
发表于 2006-06-05 15:25 |只看该作者
父类A里有的方法是:f(int),f(),没有f(char)这个方法,你怎么重载呀.

论坛徽章:
0
3 [报告]
发表于 2006-06-05 15:33 |只看该作者
原帖由 amed 于 2006-6-5 15:17 发表
我现在遇到这样一个问题。假设A类里面有2个方法 f(int),f()。 现在B类公有的继承A类,正常情况下B类里面已经有了A类的方法,我们可以这样使用A
A a;
a.f();
a.f(6);

但是如果我在B里面重载f(),例如我加了 ...

B a;?
a.f()

论坛徽章:
0
4 [报告]
发表于 2006-06-05 15:34 |只看该作者
楼主,你看一下这个吧. 我觉的你把基类中的(int),方法给隐藏掉了.
  实例一:
  
  #include "stdafx.h"
  #include <iostream.h>

  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都被隐藏。

如果还不清楚,看一下这里:http://www.qtcn.org/blog/blog.php?do-showone-tid-174.html

论坛徽章:
0
5 [报告]
发表于 2006-06-05 15:38 |只看该作者
我在C版有一篇讨论覆盖重载等机制的文章,楼主可以看看

论坛徽章:
0
6 [报告]
发表于 2006-06-05 15:47 |只看该作者
原帖由 fyimail 于 2006-6-5 15:34 发表
楼主,你看一下这个吧. 我觉的你把基类中的(int),方法给隐藏掉了.
  实例一:
  
  #include "stdafx.h"
  #include <iostream.h>

  class CB
  {
  public:
    voi ...

呵呵,这个我还真不知道。又学习了。~

论坛徽章:
0
7 [报告]
发表于 2006-06-05 16:27 |只看该作者

回复 4楼 fyimail 的帖子

你讲解的不错,谢谢。那这个有什么方法可以避免吗,我就想继承,但是我又改了其中的一个函数,导致了其他的父类同名函数都继承不下来,这有没有办法解决。

另外,我刚才试了一下,如果不是方法,是操作符,例如父类<<int,<<char, 在子类出现<<随便一种类型,父类的<<int, <<char还是照样可以继承的。

论坛徽章:
0
8 [报告]
发表于 2006-06-05 16:53 |只看该作者
原帖由 amed 于 2006-6-5 15:17 发表
我现在遇到这样一个问题。假设A类里面有2个方法 f(int),f()。 现在B类公有的继承A类,正常情况下B类里面已经有了A类的方法,我们可以这样使用A
A a;
a.f();
a.f(6);

但是如果我在B里面重载f(),例如我加了 ...


在A中申明virtual f(),f(6)
在B中重新定义f(),f(int),f(char)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP