CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

谁能给我解释一下这里的应用..

楼主EffectiveCpp(我当老板时不会忘记各位的)2004-09-04 02:10:35 在 C/C++ / C++ 语言 提问

class   B{  
          protected:  
                  void   f1()   {   }  
  };  
  class   D   :   private   B{        
          public:  
                  using   B::f1;  
  };  
  int   main()  
  {  
          D   d1;  
          d1.f1();  
  }  
  上面的程序很正常.为什么D私有继承B还可以把B::f1放在public区呢?  
  这不是把B::f1的使用级别提升了吗?那前面的private的派生限制有什么意义呢?  
  问题点数:20、回复次数:9Top

1 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 03:23:11 得分 10

这里有   using   名空间   这个f1是B里面的   不是自己继承而来的。尽管是一样。    
  想象一下   在D里面重载了f1(),   这样就比较好理解一些了  
   
  using   namespace   std;  
  class   B{  
          protected:  
                  void   f1()   {cout<<"B"<<endl;   }  
  };  
  class   D   :   private   B{  
          public:  
                  using   B::f1;  
                  void   x(){fi();}  
          private:  
                  void   fi(){cout<<"C"<<endl;}  
  };  
   
  int   main(int   argc,   char*   argv[])  
  {  
                  D   d1;  
   
          d1.f1();  
          d1.x();  
                  return   0;  
  }  
  Top

2 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 03:24:35 得分 0

不好意思   不是重载   是覆盖Top

3 楼comebaby(游民)回复于 2004-09-04 03:26:10 得分 0

问:using   B::f1是什么意思??Top

4 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 03:38:34 得分 0

protected   就是意味着   对于自己   象private   而对于派生类就象public  
   
  using   B::f1;能够被d调用就很正常了   因为f1正好说明了这个特性   这里不存在级别提升,放在public里就相当于调用了基类的protected  
   
  如果没有   using   B::f1;的话,d将不能调用任何函数。因为全部都是private。  
  如果直接写:  
  public:  
                  void   f1(){};  
  这就变成覆盖了  
   
  Top

5 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 03:39:53 得分 0

问:using   B::f1是什么意思??  
   
  使用名空间   表示这里的f1是B里面的Top

6 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 03:47:25 得分 10

不好意思   我粗心把f1写成了fi   代码有错误。   这里不能覆盖,会产生二义性。  
  #include   <iostream>  
  using   namespace   std;  
  class   B{  
          protected:  
                  void   f1()   {cout<<"B"<<endl;   }  
  };  
  class   D   :   private   B{  
          public:  
                  using   B::f1;//调用B里面的f1  
                  void   x(){f1();}//调用自己继承来的f1  
          private:  
   
  };  
   
  int   main(int   argc,   char*   argv[])  
  {  
                  D   d1;  
   
          d1.f1();//可直接调用B里的保护成员  
          d1.x();//间接调用自己的私有成员  
                  return   0;  
  }Top

7 楼EffectiveCpp(我当老板时不会忘记各位的)回复于 2004-09-04 17:46:47 得分 0

using   B::f1;能够被d调用就很正常了   因为f1正好说明了这个特性   这里不存在级别提升,放在public里就相当于调用了基类的protected  
   
  //是的,对于派生类而言基类的protected相当于public的,但它是private继承.  
  //那就是讲基类的不管是public,protected成员都相于派生类中的私有成员呀.  
  //所以如果可以把一个私有成员用using   的方式提升到public层,那么似乎可以这样:  
  class   D{  
  pubic:  
        using   D::f1;  
  private:  
        void   f1();  
  };  
  但我们知道这样是不对的.  
  我觉得我的推理似乎合理...  
   
   
  还有一个问题,  
  同时用using   B::f1;和void   f1(){}在public中.  
  为什么不产生二义性?它们又没有重载...为什么说自己定义的f1覆盖了using   B::f1?  
   
   
  在D中的private中定义了一个f1()为什么是覆盖了public中的using   B::f1?Top

8 楼EffectiveCpp(我当老板时不会忘记各位的)回复于 2004-09-04 23:14:09 得分 0

upTop

9 楼EffectiveCpp(我当老板时不会忘记各位的)回复于 2004-09-05 22:55:58 得分 0

Anybody?Top

相关问题

  • 解释一下API函数"BitBlt"的各个参数的含义以及应用(-)
  • 请问谁能解释一下什么是企业集成应用程序?
  • 有谁能帮我解释一下回调函数?能不能讲一下一般它应用的地方
  • 解释一下:
  • 解释一下this?
  • 解释一下
  • 关于CRM再问:开发基于CRM的应用程序是如何,能具体解释一下吗?
  • 哪个高手解释一下多层应用程序中进行COM服务器的配置问题!!!
  • 哪位老大能解释一下const在这里的含义。
  • 解释一下using.

关键词

  • f1
  • 继承
  • namespace std
  • protected
  • cout
  • private

得分解答快速导航

  • 帖主:EffectiveCpp
  • ntxs
  • ntxs

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo