免费注册 查看新帖 |

Chinaunix

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

[C++] 一个疑惑的C++问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-07 10:33 |只看该作者 |倒序浏览
已知3个类O,P,Q,类O 中定义了一个私有方法F1,一个公有方法F2和一个受保护的方法F3,类P和类Q是类O的派生类,其继承方式如下所示:

class P:protected O{.....};

class Q:public O{.....};

关于方法F3的描述中正确的是____(36)

(36)    A    类O,P,Q的对象都可以访问方法F3       B      类O,P和Q的对象都不可以访问方法F3

           C   类O和Q的对象都可以访问方法F3         D     类P和Q的对象都可以访问方法F3

论坛徽章:
0
2 [报告]
发表于 2006-10-07 10:53 |只看该作者
protected 方法 与 private 方法的访问权限是一样的。除了可以继承外

论坛徽章:
0
3 [报告]
发表于 2006-10-07 10:58 |只看该作者
我个人理解的是B,呵呵!但是看有些地方的答案不一样,所以存在疑问

[ 本帖最后由 Leacen 于 2006-10-7 11:03 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-10-07 12:17 |只看该作者
A.
protected继承把原本public的成员变成了protected.

论坛徽章:
0
5 [报告]
发表于 2006-10-07 12:28 |只看该作者
protected 的访问属性等同于 private

不会是 A

论坛徽章:
0
6 [报告]
发表于 2006-10-07 12:35 |只看该作者

  1. #include <iostream>
  2. #include <list>

  3. class Base
  4. {
  5.     protected:
  6.         void f()
  7.         {
  8.             printf("Base\n");
  9.         }
  10. };

  11. class A : protected Base
  12. {
  13.     public:
  14.         void test()
  15.         {
  16.             f();
  17.         }
  18. };

  19. class B : public Base
  20. {
  21.     public:
  22.         void test()
  23.         {
  24.             f();
  25.         }
  26. };

  27. int main(int argc, char *argv[])
  28. {
  29.     A a;
  30.     B b;

  31.     a.test();
  32.     b.test();

  33.     return 0;
  34. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2006-10-07 12:46 |只看该作者
converse 兄没仔细看吧

A    类O,P,Q的对象都可以访问方法F3

论坛徽章:
0
8 [报告]
发表于 2006-10-07 12:54 |只看该作者
我觉得我对"访问"这个词的理解是没有问题的,好比说一个类的private成员对外是不暴露的,但是对内的话这个类的对象是可以访问的,这里也是一样的道理.

比如:

  1. class Test
  2. {
  3. public:
  4.     void f(Test *p)
  5.    {
  6.          p->g();
  7.    }
  8. private:
  9.     void g()
  10.     {
  11.          printf("test");
  12.     }
  13. };

  14. int main()
  15. {
  16.      Test a, b;
  17.      a.f(&b);

  18.      return 0;
  19. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2006-10-07 13:19 |只看该作者
原帖由 converse 于 2006-10-7 12:35 发表

  1. #include <iostream>
  2. #include <list>

  3. class Base
  4. {
  5.     protected:
  6.         void f()
  7.         {
  8.             printf("Base\n");
  9.         }
  10. };

  11. class A : protected ...
复制代码

这样一来,就成了派生类访问基类中的protected方法,而不是派生类的对象访问基类中的protected 方法。
按楼主的题目原意来说,应该用这样的代码测试

  1. class base
  2. {
  3. protected:
  4.     f();
  5. };
  6. class A:public base
  7. {
  8. };
  9. class B:protected base
  10. {
  11. };
  12. int main(int argc, char *argv[])
  13. {
  14.     A a;
  15.     B b;

  16.     a.f();
  17.     b.f();

  18.     return 0;
  19. }
复制代码

[ 本帖最后由 namtso 于 2006-10-7 13:21 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-10-07 13:22 |只看该作者
原帖由 namtso 于 2006-10-7 13:19 发表

这样一来,就成了[coror=red]派生类访问基类中的protected方法,而不是派生类的对象访问基类中的protected 方法。
按楼主的题目原意来说,应该用这样的代码测试
[code]
class ba ...


理由我在给mik的回复中解释了我对访问一词的理解了.
其实,那样不行是因为不能对外暴露,但是protected继承过来的类的对象访问基类的protected成员是没有问题的,代码也是见给mik的回复中,区别在于在哪里访问而已.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP