Chinaunix首页 | 论坛 | 博客
  • 博客访问: 56680
  • 博文数量: 9
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-14 22:57
个人简介

沧海之一粟

文章分类

全部博文(9)

文章存档

2015年(2)

2014年(7)

我的朋友

分类: C/C++

2014-05-29 12:05:04

众所周知,派生类只能访问基类的protected和public成员。
如果想让基类的protected成员在派生类中变成public成员,有没有这种可能性?
答案是有!
下面举例说明:

  1. #include <iostream>

  2. using namespace std;

  3. class A
  4. {
  5. public:
  6.         A()
  7.         {
  8.                 m = 10000;
  9.                 n = 20000;
  10.         }
  11.         int m;
  12.         friend int get_val(A* pa);
  13. protected:
  14.         int n;
  15.         int get_val() { return m; }
  16. };

  17. int get_val(A* pa)
  18. {
  19.         return pa->n;
  20. }

  21. class B : public A
  22. {
  23. public:
  24.         using A::n;
  25.         using A::get_val;
  26. };

  27. class C : public A
  28. {
  29. };

  30. class D : public B
  31. {
  32. };

  33. int main(void)
  34. {
  35.         // Now, we can access n and get_val freely outside B.
  36.         B b1;
  37.         b1.n = 2;
  38.         cout << b1.n << endl;
  39.         cout << b1.get_val() << endl;

  40.         // Can not do it.
  41.         C c1;
  42.         //cout << c1.n << endl;
  43.         //cout << c1.get_val() << endl;

  44.         // accessing n by indirect derivation
  45.         D d1;
  46.         cout << d1.n << endl;
  47.         cout << d1.get_val() << endl;

  48.         // accessing n belongs to class A
  49.         cout << ::get_val(&b1) << endl;

  50.         return 0;
  51. }
输出结果为:
2
10000
20000
10000
2

结果分析:
1,可以在B的外部访问B继承自基类的protected属性。
2,通过A的友元函数friend int get_val(A* pa)得到了A的成员n的值为2。
    依据本人以前的博文C++多态指的是行为上的多态,而不是属性上的多态!
    由此说明,使用using指令并没有给B增加新的成员,只是改变了基类成员的访问权限。
3,B的派生类D也可以在其外部访问n和get_val成员。说明修改后的属性的访问权限也能被子类继承。

故可以得出以下结论
可以通过使用using指令来放大基类protected成员的访问权限。
当访问权限在派生类中被放大之后,成员的访问权限在派生类的派生类中仍然有效!

对于Java语言来说,基类中的成员方法在派生类中如果要被重写的话,其访问权限只能变小不能变大。
也就是说访问权限只能从public变为protected或者private;或从protected变为private。

阅读(2054) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~