自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件
自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件
自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

前言

C++中,publicprivateprotected是三个重要的访问修饰符,它们用于控制类成员的访问权限。

下面简单记录一下相关知识,记录于此,方便自己查阅。

正文

为了验证权限,下面写demo进行测试。

修饰属性和函数

private

私有属性,即类成员对外不可见,对内可见。此为默认属性,未指定访问属性的成员会被默认为是private属性。

protected

保护属性,即成员对外不可见,对内可见,对派生类可见。

public

公有属性,即类成员对外可见,对内也可见。

demo

下面通过一个demo看一下权限访问范围。

  1. class BiuParent{
  2. private:
  3.   int biu_field_private;
  4.   void biu_fun_private() {
  5.       std::cout << "biu_fun_private" << biu_field_private << std::endl;
  6.       std::cout << "biu_fun_private" << biu_field_protected << std::endl;
  7.       std::cout << "biu_fun_private" << biu_field_public << std::endl;
  8.   }
  9. protected:
  10.   int biu_field_protected;
  11.   void biu_fun_protected() {
  12.       std::cout << "biu_fun_protected" << biu_field_private << std::endl;
  13.       std::cout << "biu_fun_protected" << biu_field_protected << std::endl;
  14.       std::cout << "biu_fun_protected" << biu_field_public << std::endl;
  15.   }
  16. public:
  17.   int biu_field_public;
  18.   void biu_fun_public() {
  19.       std::cout << "biu_fun_public" << biu_field_private << std::endl;
  20.       std::cout << "biu_fun_public" << biu_field_protected << std::endl;
  21.       std::cout << "biu_fun_public" << biu_field_public << std::endl;
  22.   }
  23.   BiuParent() {
  24.       biu_field_private = 1;
  25.       biu_field_protected = 2;
  26.       biu_field_public = 3;
  27.       std::cout << "BiuParent()---> biumall.com" << std::endl;
  28.   }
  29. };
复制

初始化类对象,看一下

  1. int main()
  2. {
  3.   BiuParent biuParent;
  4.   //std::cout << biuParent.biu_field_private << std::endl; // 不可访问
  5.   //std::cout << biuParent.biu_field_protected << std::endl; // 不可访问
  6.   std::cout << biuParent.biu_field_public << std::endl; //可以访问
  7.   //biuParent.biu_fun_private(); //不可调用
  8.   //biuParent.biu_fun_protected(); //不可调用
  9.   biuParent.biu_fun_public(); //可以调用
  10. }
复制
小结
  1. 类中可以访问private,protected和public的成员变量和成员函数。

  2. 类的对象除了public的变量可以访问,其他private和protected变量都不可以访问。

修饰继承方式

public,private,protected不仅可以修饰成员变量和成员函数,还可以修饰继承方式。

下面测试不同的继承方式,看看访问类成员的权限有哪些变化。

测试1

子类以private方式继承

  1. class BiuSon : private BiuParent {
  2. public:
  3.   BiuSon() {
  4.       std::cout << "BiuSon()---> biumall.com"<< std::endl;
  5.       //biu_field_private = 4; //不可以访问
  6.       biu_field_protected = 5;
  7.       biu_field_public = 6;
  8.       //biu_fun_private(); //不可以访问
  9.       biu_fun_protected();
  10.       biu_fun_public();
  11.   }
  12. };
复制

或者以protected方式继承(因为效果一样,所以都放一起)

  1. class BiuSon : protected BiuParent {
  2. public:
  3.   BiuSon() {
  4.       std::cout << "BiuSon()---> biumall.com"<< std::endl;
  5.       //biu_field_private = 4; //不可以访问
  6.       biu_field_protected = 5;
  7.       biu_field_public = 6;
  8.       //biu_fun_private(); //不可以访问
  9.       biu_fun_protected();
  10.       biu_fun_public();
  11.   }
  12. };
复制

可以看出,使用private或protected修饰继承方式,父类中private修饰的成员不可以访问,其他的均可以访问。

继续看子类对象访问情况:

  1. int main()
  2. {
  3.   BiuSon biuSon;
  4.   //std::cout << biuSon.biu_field_private << std::endl; // 不可访问
  5.   //std::cout << biuSon.biu_field_protected << std::endl; // 不可访问
  6.   //std::cout << biuSon.biu_field_public << std::endl; //不可访问
  7.   //biuSon.biu_fun_private(); //不可调用
  8.   //biuSon.biu_fun_protected(); //不可调用
  9.   //biuSon.biu_fun_public(); //不可调用
  10. }
复制

子类对象无法访问父类的任意成员。

小结
  1. 使用private或protected继承父类的子类,除了private修饰的,其他的都可以访问

  2. 使用private或protected继承父类的子类的对象,父类中任意的成员或函数都不可以访问。(不管啥修饰权限,都不允许)

测试2

以public方式继承

  1. class BiuSon : public BiuParent {
  2. public:
  3.   BiuSon() {
  4.       std::cout << "BiuSon()---> biumall.com"<< std::endl;
  5.       //biu_field_private = 4; //不可以访问
  6.       biu_field_protected = 5;
  7.       biu_field_public = 6;
  8.       //biu_fun_private(); //不可以访问
  9.       biu_fun_protected();
  10.       biu_fun_public();
  11.   }
  12. };
复制

上面以public,访问,对于父类private修饰的属性和方法依旧不可以访问。

继续看子类对象访问情况:

  1. int main()
  2. {
  3.   BiuSon biuSon;
  4.   //std::cout << biuSon.biu_field_private << std::endl; // 不可访问
  5.   //std::cout << biuSon.biu_field_protected << std::endl; // 不可访问
  6.   std::cout << biuSon.biu_field_public << std::endl; //可访问
  7.   //biuSon.biu_fun_private(); //不可调用
  8.   //biu_fun_protected(); //不可调用
  9.   biuSon.biu_fun_public(); //可调用
  10. }
复制

但对于子类对象来说,除了父类中public修饰的就可以访问了,其他的都不允许。

小结
  1. 使用private或protected继承父类的子类,除了private修饰的,其他的都可以访问。

  2. 使用public继承父类的子类的对象,仅可以访问public修饰的父类成员。

测试3

除了public方式继承,还有一种是默认方式继承,也就是不写修饰符。

  1. class BiuSon : BiuParent {
  2. public:
  3.   BiuSon() {
  4.       std::cout << "BiuSon()---> biumall.com" << std::endl;
  5.       //biu_field_private = 4; //不可以访问
  6.       biu_field_protected = 5;
  7.       biu_field_public = 6;
  8.       //biu_fun_private(); //不可以访问
  9.       biu_fun_protected();
  10.       biu_fun_public();
  11.   }
  12. };
复制

子类中出来private修饰的无法访问,其他的都可以。

继续看子类对象访问情况:

  1. int main()
  2. {
  3.   BiuSon biuSon;
  4.   //std::cout << biuSon.biu_field_private << std::endl; // 不可访问
  5.   //std::cout << biuSon.biu_field_protected << std::endl; // 不可访问
  6.   //std::cout << biuSon.biu_field_public << std::endl; // 不可访问
  7.   //biuSon.biu_fun_private(); //不可调用
  8.   //biu_fun_protected(); //不可调用
  9.   //biuSon.biu_fun_public(); //不可调用
  10. }
复制

子类对象无法访问父类的任意成员。

小结
  1. 使用private或protected继承父类的子类,除了private修饰的,其他的都可以访问。

  2. 使用默认方式继承父类的子类的对象,父类中任意的成员或函数都不可以访问。(不管啥修饰权限,都不允许)

参考文章

  1. c++ public private protected区别

自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

相关文章

自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

暂无评论

none
暂无评论...