众所周知,派生类只能访问基类的protected和public成员。
如果想让基类的protected成员在派生类中变成public成员,有没有这种可能性?
答案是有!
下面举例说明:
-
#include <iostream>
-
-
using namespace std;
-
-
class A
-
{
-
public:
-
A()
-
{
-
m = 10000;
-
n = 20000;
-
}
-
int m;
-
friend int get_val(A* pa);
-
protected:
-
int n;
-
int get_val() { return m; }
-
};
-
-
int get_val(A* pa)
-
{
-
return pa->n;
-
}
-
-
class B : public A
-
{
-
public:
-
using A::n;
-
using A::get_val;
-
};
-
-
class C : public A
-
{
-
};
-
-
class D : public B
-
{
-
};
-
-
int main(void)
-
{
-
// Now, we can access n and get_val freely outside B.
-
B b1;
-
b1.n = 2;
-
cout << b1.n << endl;
-
cout << b1.get_val() << endl;
-
-
// Can not do it.
-
C c1;
-
//cout << c1.n << endl;
-
//cout << c1.get_val() << endl;
-
-
// accessing n by indirect derivation
-
D d1;
-
cout << d1.n << endl;
-
cout << d1.get_val() << endl;
-
-
// accessing n belongs to class A
-
cout << ::get_val(&b1) << endl;
-
-
return 0;
-
}
输出结果为:
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。
阅读(2088) | 评论(0) | 转发(1) |