c++ 继承访问控制初步

访问控制方式这里有篇很好的文章,其实内容也是总结c++primer上的内容
现在就按照这篇的文章举例进行学习.

思路

不同继承方式的影响主要体现在:

1、派生类成员对基类成员的访问控制。

2、派生类对象对基类成员的访问控制

三种继承方式

公有继承(public)

所有public和protected成员在派生类中的访问方式不变,但是私有成员(private)不能访问

  1. 通过派生类的成员函数能够访问基类的public和protected成员,但是不能访问基类的成员.

  2. 通过派生类的对象能够只能访问基类中的public成员.

举例说明

class A {
 public :
   int a = 0;
 protected:
   int b = 0;
 private:
   int c = 0;
}

class B:public A{
  public:
  void test1(){
   cout
  }

}class A {
 public :
   int a = 0;
 protected:
   int b = 0;
 private:
   int c = 0;
};

class B:public A{
  public:
  void test1(){
   cout<<"visit public a "<< a<<endl;
  }
  void test2(){
   cout << "visit protected "<< b <<endl;
  }
  void test3(){
 //  cout << "visit private "<< c <<endl;  违反第1)条  报错
  }
};

int main()
{
  B b;
  b.test1();
  b.test2();
  //b.test3();
  cout << b.a<<endl;
//  cout << b.b<<endl;  违反第2)条  报错
//  cout << b.c<<endl;  违反第3)条  报错
  return 0;
}

私有继承(private)

基类中的成员都以private的身份出现在派生类当中,派生类中的成员不能访问父类的private成员
1)派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员
2)通过派生类的对象不能访问基类中的任何成员。

如果将上边的代码改成B私有继承A.新增一条报错语句 cout << b.a <<endl;违反2)

保护继承(protected)

基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可访问。
1)派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。
2)通过派生类的对象不能访问基类中的任何成员。
它的报错情况同private.其实在垂直访问上procted与public相同,对类对象的用户来说,它又和private相同.即实现了代码重用的同时还限定了用户的访问权限.为了说明问题我们再加一个类:

class C: protected B{
 public:
  void test2(){
    cout << "visited b in C"<< b<<endl;
  } 

};

如果有:
C c;
c.b肯定报错,但是C中test2()函数不会报错,可以访问b,因为b的protect属性被传递过来了.但是如果B私有继承A的话,b就不会传递过来.代码重用性就不好了.

当然还有一些其他有待研究的遗留问题,比如友元在访问控制中有什么作用呢,会不会被继承.六大函数在继承中又扮演着什么角色.留待以后继续研究.如要深究,请仔细阅读c++ primer P549的内容继续学习.

posted @ 2017-07-28 12:07  bzt007  阅读(172)  评论(0编辑  收藏  举报