免费注册 查看新帖 |

Chinaunix

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

c++访问级别的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-25 20:53 |只看该作者 |倒序浏览
最近在复习C++,遇到一些问题,上来请教各位。

  1. class base {
  2.     private:
  3.         int i;
  4.     protected:
  5.         void pfun(void) { cout<<"call base pfun"<<endl; }
  6.         void pfun2(void) { cout<<"call base pfun2"<<endl; }
  7. };

  8. class derive : private base {
  9.     public:
  10.         void access_pfun(void) { pfun(); }
  11.         using base::pfun2; //将从base 继承来的pfun2 的可见性改为public
  12. };

  13. int main() {
  14.     derive d;
  15.     d.access_pfun();
  16.     d.pfun2(); // 类外可以访问
  17. }
复制代码


书上讲到,“派生类可以限制其基类成员的可见性,但却不能提升他们的可见性。”
但上例中,pfun2()在base 类里为protected,现在继承之后,derive类将其基类成员pfun2() 访问级别提升为public了。
且运行都没问题。为什么?

论坛徽章:
0
2 [报告]
发表于 2009-04-25 20:56 |只看该作者
我看看

论坛徽章:
0
3 [报告]
发表于 2009-04-25 21:14 |只看该作者

回复 #1 disheng727 的帖子

我觉得你写的
using base::pfun2; //将从base 继承来的pfun2 的可见性改为public
这个已经不属于base了
等同于覆盖掉了基类里面的这个函数了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2009-04-25 21:23 |只看该作者
原帖由 disheng727 于 2009-4-25 20:53 发表
“派生类可以限制其基类成员的可见性,但却不能提升他们的可见性。”


这句话仅仅指:
class D : /* 这里 */ B {
//  不指这里
};

public 继承不能提升基类中的private和protected。 基类的所有成员仍保持原访问权限。
protected 将基类中的public加强为protected。 基类中protected、private成员访问权限不变。
private 继承将基类中public、protected加强为private。 基类中所有成员全为private。

之后, 派生类想怎么搞就怎么搞了 ……
比如将基类中的非虚protected暴露为public。
或者将基类中的虚protected、privated覆写、并提升到public。

论坛徽章:
0
5 [报告]
发表于 2009-04-25 21:33 |只看该作者

回复 #4 OwnWaterloo 的帖子

你太扎实了,谢谢。
请问,你学C++都阅读了哪些书籍?

论坛徽章:
0
6 [报告]
发表于 2009-04-25 21:38 |只看该作者
的确能正常运行!而且主函数里还没返回值!

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2009-04-25 22:02 |只看该作者
原帖由 yuchenyier 于 2009-4-25 21:38 发表
的确能正常运行!而且主函数里还没返回值!


C++标准规定, main函数中允许省略返回语句 —— 仅仅对main。
在每个退出点上, 如果没有返回语句, 将认为返回0。

也就是说, 一个合法的最小的C++程序如下:
int main() {}



但在VC6中, 给出了一个很搞笑的警告:
warning C4508: 'main' : function should return a value; 'void' return type assumed


同样, 如下的C++代码也是合法的:
int main(int argc,char* []) {
    switch (argc)
    {
    case 1:
        return -1;
    default:
    case 3:
    case 2:
        ;
    }
}


如果没有输入命令行参数, 返回一个错误。
其他情况, 当控制流出case 2之后, return 0;会被自动添加。

同样, VC6还是会给出警告……
warning C4715: 'main' : not all control paths return a value


如果查看VC生成的汇编代码, 可以看到 VC8、9中, 在返回之前, 有:
xor eax,eax

gcc的汇编格式我看不懂 …… 就不说了 ……
但是windows下和xnix下都有相应的取得上次调用返回值的方式, 也可以验证之。


说了这么多……  楼主的代码是正确的。
只是对VC6有点不友好 ……
不对……  是VC6会对楼主的代码不友好 ……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
8 [报告]
发表于 2009-04-25 22:55 |只看该作者

回复 #5 disheng727 的帖子

对C++真正感兴趣, 大概是从看《C++必知必会》开始的吧。
里面有很多关于模板的有趣的技术, (当然, 那本书还有很多其他很好的论题)
反正我是从这边书学到 iterator_trait 是干嘛用的……
《STL源码剖析》都没看明白这个问题……  jjh的翻译读起来还是不太顺畅……


C++的书很多, C++支持的编程思想也很多(这里就不说C++能干的事很多了……)
关于模板(这里不说范型, C++的模板应用已经超出了范型的范畴)的有:
《c++ templtes》 《c++ template metaprogramming》《modern c++ design》
《STL源码剖析》

这些书着重是将库的实现技术。
如果只是想使用模板库, 而不是开发模板库的话, 有这些书:
《effective stl》, 《beyond stl》

网络上有很多零散文章都是介绍boost都是讲boost的实现
但《beyond stl》是从使用方面,介绍boost的, 如果想使用boost, 严重推荐这本书。
实现boost嘛 ……  真没什么必要 ……
更多的是体力活 …… 而不是智力活……

还有一本《the c++ standard library》既讲了stl的架构, 也讲了stl的实现细节。
如果《effective stl》不满足胃口, 可以看看这个。

《C++ 输入输出流及本地化》是专门将stl stream架构的。
stl的stream确实被设计得有点过于庞大了 ……


模板很有意思, 但实际开发中也许用处不大:
1. 显著延长编译时间是肯定的。
2. 抑制代码膨胀要靠编写技术。
3. 各编译器对模板的支持程度相差太大
4. 而且模板对大多数人来说, 比较难理解 ……
java为什么流行? 因为java易学, 所以能很容易招到合格的java员工。
如果打算大量采用模板, 要找到合格的使用模板的C++员工, 估计很难不赔本 ……



C++的其他方面—— ADT、OO 就没什么专门的书籍了。
《effective》系列、 《exceptional》系列、《必知必会》《C++编程规范》 都是很经典的书籍, 包罗万象 ……

《inside the c++ object model》经典是经典。
但实际开发中, 我觉得同样不必要。 反而会对编译器行为作一些不合理的假设。
有兴趣可以看 ……

《C++程序设计陷阱》 同《C陷阱与缺陷》一样, 讲一些日常开发中经常出现的问题。
但是因为C++复杂的多, 所以这本书也就比后者厚得多 ……
没有effective那么短小精悍 ……

《C++沉思录》 作者很有名气。
但总觉得内容不是很对胃口 ……  觉得作者讲的是8、90年代的C++ ……

《accelerated c++》是刘未鹏严重推荐的一本书。
不过我没看 ………………

他同时推荐(他觉得这2本书就了)的、 也是我觉得C++最经典的书籍:
《The C++ Programming Language》, 毕竟还是老子最了解儿子 ……
百看不腻 …… 每次都有收获 ……
这边书搭配的题解也很有意思 …… 不过有点难 ……

C++之父还有一本书 《the design and evolution of c++》。
对开发没太大帮助。 可以当作休闲读物, 与回答某些sb提出的sb问题的资料……


有一本不得不提的书—— 《Imperfect C++》(中文版是刘未鹏译、 忘记名字了 ……)。
如书名所说 ……  C++确实有不少缺点, 其中最严重的是没有ABI。
导致C++所有漂亮的特性, 只能局部于一个模块。
出了模块边界, 就全部退化干净了 ……


还有一个系列, 叫《c++ in depth》。 是C++之父推荐的。
比如有《c++ 多范型程序设计》, 不过我觉得在实际开发中, 很难被应用上 ……
这系列还有其他一些书, 没看过了 ……



C++中面向过程的方式, 其实同C区别不大, 可以参考C的书, 或者《c++ primer》第4版以前的版本。


严重推荐的书:
《高质量C/C++编程指南》 —— 绝对要看, 严重的误人子弟。

谭浩强老师的书。
关于谭浩强老师, 他的C语言我看过, 说实话 ,很烂 ……
他写的C++的书连封面都没见过。
不过他对中国教育还是有其贡献的——为广大的中国程序员进行了扫盲工作。
所以尊称他为老师。 不像林锐 ……  所谓的半罐水……


《C++编程思想》么 ……
我没看过英文, 据说中文翻译得不好 ……
但就是中文也没看完过 ……
Bruce Eckel是牛, 但是他写的C++代码总觉得不太纯正 ……
每次都看到一半就看不下去了……

[ 本帖最后由 OwnWaterloo 于 2009-4-25 23:00 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-04-25 23:10 |只看该作者
原帖由 OwnWaterloo 于 2009-4-25 22:55 发表
对C++真正感兴趣, 大概是从看《C++必知必会》开始的吧。
里面有很多关于模板的有趣的技术, (当然, 那本书还有很多其他很好的论题)
反正我是从这边书学到 iterator_trait 是干嘛用的……
《STL源码剖析》 ...


总结得很好,学习了。

论坛徽章:
0
10 [报告]
发表于 2009-04-25 23:16 |只看该作者

回复 #8 OwnWaterloo 的帖子

一看就知道是经验丰富,看了那么多书,不同的书的侧重点都把握的一清二处。
自己正在努力从C转向C++。谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP