首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于基础东西,private 和 protected 访问权根有关问题

2012-03-13 
关于基础东西,private 和 protected 访问权根问题~本人有如下这列子,哪位高手懂的,告诉偶一下.classbase{p

关于基础东西,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//在派生类中不可访问

热点排行