深入剖析C++成员权限问题。

来源:互联网 发布:逆波兰表达式c语言 编辑:程序博客网 时间:2024/05/20 02:55
一,C++中的类成员访问权限;
1,分类:
public:         具有这个访问控制级别的成员是完全公开的,任何环境下都可以通过对象访问这个成员  
private:       具有这个访问控制级别的成员是完全保密的,即只能通过指向当前类(不包括派生类)的  
                        this   指针才可以访问,其它环境均无法直接访问这个成员  
protected:   具有这个访问控制级别的成员是半公开的:外界无法直接访问这个控制级别的成员,但是派生类的   this   指针可以获得访问能力。  

2,C++中的默认权限是:
class是private
class中的成员的缺省权限也是private!
3,类的访问权限是针对于类而言的,如果是同一个类的话,名字空间相同。那么其中的相同的类的对象可以按照this指针操纵其中的成员。
eg:
class Test{
  public:
    Test();
    Test(Test *t); //拷贝构造函数!
  private:
    int a;       
};
Test::Test(Test *t)
{
  a=t->a; //直接访问其中的私有,类似this指针!
}

二,C++中类的继承对成员访问权限的影响以及各种继承的权限关系!

1,C++中A类继承B类意味着A类中含有B类的所有成员,当然由于权限的缘故并不能那么顺利的访问他们就是了。

2,各种继承关系导致的访问权限的改变。

1)缺省情况的继承方式是private继承当然这并不是我们所应该的一个设计!所以应该要注意不要随意的用缺省的继承方式!

2) public 继承:
基类中的成员在派生类中的权限变化是: public--> public. protected-->protected.  private-->不可访问!3)       

3)protected继承:
权限变化是: public-->protected, protected-->protected。 private-->不能访问

4)private继承:
权限变化: public-->private, protected-->private,private-->不能访问。
PS:
a,其中权限发生变化的指的就是在派生类中可以通过this指针读取,但是他对于外界而言的权限发生相应的变化!
b,而其中的不能访问就是指在派生类当中即使是this指针也无法访问了!
c,归纳一点就是说,private的成员在派生类中不具备可访问性,而protectd跟public的成员则根据相应的继承方式而在派生类中的权限发生相应的变化。public不变,protected继承编程protectd,private全部编程private!
d,多层次的继承则按照这个规律递推...
例题:

class Base
{
public:
  int m1;
protected:
  int m2;
private:
  int m3;
};

class PrivateClass:private Base
{
//m1,m2变成私有,m3不可访问
public:
  void Test()
  {
    m1=1;
    m2=2;
    m3=3;//不可访问   }
};

class DrivedFromPri:public PrivateClass
{
//m1,m2不可访问,m3继续保持不可访问
public:
  void Test()
  {
    m1=1;//不可访问
    m2=2;//不可访问
    m3=3;//不可访问
  }
};

class ProtectedClass:protected Base
{
//m1,m2变成受保护数据,m3不可访问 public:
  void Test()
  {
    m1=1;
    m2=2;
    m3=3;//不可访问
    }
};

class DerivedFromPro:public ProtectedClass
{
//m1,m2继续为保护的,m3不可访问
public:
  void Test()
  {
    m1=1;
    m2=2;
    m3=3;//不可访问
    }
};

class PublicClass:public Base
{
//m1公有,m2受保护,m3不可访问
public:
  void Test()
  {
    m1=1;
    m2=2;
    m3=3;//不可访问
  }
};

class DerivedFromPub:public PublicClass
{
//m1保持公有,m2保持受保护,m3保持不可访问
public:
    void Test()
    {
    m1=1;
    m2=2;
    m3=3;//不可访问     }
};

void main()
{
PrivateClass priobj;//m1,m2,m3都不可访问
priobj.m1=1;//不可访问
priobj.m2=2;//不可访问
priobj.m3=3;//不可访问

ProtectedClass proobj;//m1,m2受保护,m3不可访问
proobj.m1=1;//不可访问
proobj.m2=2;//不可访问
proobj.m3=3;//不可访问

PublicClass pubobj;//m1公有,m2受保护,m3不可访问
pubobj.m1=1;
pubobj.m2=2;//不可访问
pubobj.m3=3;//不可访问
}