读书人

关于基础东西,private 和 protected 访

发布时间: 2012-03-13 11:21:11 作者: rapoo

关于基础东西,private 和 protected 访问权根问题~
本人有如下这列子,哪位高手懂的,告诉偶一下.
class base
{
public:
base(void);
virtual void print(void)
{
cout < < "this is base class\n " < <endl;
}
protected:
int a;
int b;
void printprotect(void)
{
cout < < "this is base protected member\n " < <endl;
}
};
base::base()
{
a = b = 0;
}
class sub:public base
{
public:
sub(void)
{
protecteda = 1;
privateb = 4;
}
void print(void)
{
cout < < "this is sub class\n " < <endl;
}
void printbasemembervar(void)
{
cout < <a < <b < <endl;
}
void printbasememberfunc(void)
{
printprotect();
}
void subaccess(sub *p)
{
int tst;
cout < < "a= " < <a < < "\tb= " < <b < <endl;
cout < < "this is subaccess\n " < <endl;
tst = p-> a;//这里又可行?
tst = p-> b;//这里又可行?
cout < < "p-> b: " < <tst < <endl;
tst = p-> privateb;
cout < < "p-> privateb: " < <tst < <endl;
tst = p-> protecteda;
cout < < "p-> suba: " < <tst < <endl;
}
protected:
int protecteda;
private:
int privateb;
};

void main(void)
{
base a, *pb;
sub b, *ps;
ps = &b;
/*******/cout < <ps-> a < <ps-> b < <endl; //这里不可行.
cout < < "============== " < <endl;
b.subaccess(&b);
}

看举列中关于: "//这里不可行 "和 "//这里又可行? " 三处
偶这里不明白啊,C++不是说,基类protected成员,子类的对象不能直接访问!
(cout < <ps-> a < <ps-> b < <endl),所以这里不可行,我理解!

然而 tst = p-> a;这又是可行,p不是子类的对象吗?为什么又可以访问基类protected成员?这到底是怎么回事啊?
哪位已经明白的大虾,给偶讲一讲啊!这是什么原因?为什么会这样子?谢谢!



[解决办法]

类自己是自己的友元
[解决办法]
在 类外 如果想使用类中的成员,只能直接使用public类型的,protected和private都是不能访问的

但是在 基类的派生类 中,可以直接访问继承而来的protected成员,但是不能访问private限制的成员.所以在派生类中,可以访问基类继承而来的public和proected两种类型的成员.在public公有派生下,继承而来的成员访问权限不变.protected派生下, public和protected都变成protected,private派生下,所有的继承下来都是private了.

注意一个是类外,一个是 基类的派生类中

[解决办法]
在类外:
使用类中的成员,只能直接使用public类型的,protected和private都是不能访问的.
在派生类中:public + public=public;//可访问子类成员和函数(下同)
public+protected=protected;
protected+protected=Protected;
private//在派生类中不可访问

读书人网 >C++

热点推荐