C++ 的 public,protected,private 成员访问

class A {
 private:
  int m_data1;
  void print1() { std::cout << "private print1" << std::endl; }

 protected:
  int m_data2;
  void print2() { std::cout << "protected print2" << std::endl; }

 public:
  A(int x = 1, int y = 2, int z = 3) : m_data1(x), m_data2(y), m_data3(z) {}
  int m_data3;
  void print3() { std::cout << "protected print3" << std::endl; }
};

class B : public A {
 public:
  void test_public() {
    std::cout << m_data3 << std::endl;
    print3();
  }
  void test_protected() {
    std::cout << m_data2 << std::endl;
    print2();
  }
  void test_private() {
    // 下面两行编译不过,B类内无法访问父类的私有成员
  //  std::cout << m_data1 << std::endl;
  //  print1();
  }
};

int main(int argc, char const* argv[]) {
  B b;
  b.test_public();
  b.test_protected();
  b.test_private();
  std::cout << b.m_data3 << std::endl;
  // 编译不过,子类对象无法访问父类protected的成员 
  // std::cout << b.m_data2 << std::endl;
  // 编译不过,子类对象无法访问父类private的成员
  // std::cout << b.m_data1 << std::endl;

  A a;
  a.print2(); // 不可访问

  return 0;
}

简单理解:类里面的 protected 成员函数能在 public 的成员函数调用,因为类外面声明的对象只能访问 public 成员和成员函数。

                 如果想要调用 protected 成员函数或者 private 成员函数,必须依靠 public 

派生类也是如此,可以看看下面的介绍,

基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员可见,基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态;基类的私有成员不可见,基类的私有成员仍然是私有的,派生类不可访问基类中的私有成员。

基类成员对派生类对象的可见性对派生类对象来说,基类的公有成员是可见的,其他成员是不可见的。

所以,在公有继承时,派生类的对象可以访问基类中的公有成员,派生类的成员函数可以访问基类中的公有成员和保护成员。

简单来说,派生类能访问基类的public, protected成员,继承过来权限不变,派生类对象只能访问基类public成员。

如果是以 protected 继承的,则基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。

参考:5分钟掌握C++中的三种继承方式

 

posted @ 2021-10-09 16:09  strive-sun  阅读(37)  评论(0)    收藏  举报