浅析c++ public protected private的访问控制

个人体会:继承并不是基类的东西全是你的,当出现多次间接继承的时候,这个问题就凸显出来了

c++中private,public,protected的访问控制

第一:private,public,protected方法的访问范围.public继承下)

private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问.

protected: 可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问

public: 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问

注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数

第二:类的继承后方法属性变化:

使用private继承,父类的所有方法在子类中变为private;

使用protected继承,父类的protectedpublic方法在子类中变为protected,private方法不变;

使用public继承,父类中的方法属性不发生改变


1.public继承方式下

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. class Animal  
  4. {  
  5. public:  
  6.     Animal(){}  
  7.     void eat()  
  8.     {  
  9.         cout << "eat/n";  
  10.     }  
  11. protected:  
  12.     void play()  
  13.     {  
  14.         cout << "play/n";  
  15.     }  
  16. private:  
  17.     void drink()  
  18.     {  
  19.         cout << "drink/n";  
  20.     }  
  21. };  
  22. class Giraffe: public Animal  
  23. {  
  24. public:  
  25.     Giraffe(){}  
  26.     void StrechNeck()  
  27.     {  
  28.         cout << "Strech neck /n";  
  29.     }  
  30.     void take()  
  31.     {  
  32.         eat();      // ok,公有继承下,基类的公有成员对派生类可见  
  33. //      drink();    // error,公有继承下,基类的私有成员对派生类不可见,也就是说,派生类不能访问基类私有成员  
  34.         play();     // ok,公有继承下,基类的保护成员对派生类可见  
  35.     }  
  36. };  
  37.   
  38.   
  39. int main()  
  40. {  
  41.     Giraffe gir;  
  42.     // 以下三条语句说明基类成员对派生类对象的可见性  
  43.     gir.eat();              // ok,公有继承下,基类的公有成员对派生类对象可见  
  44.     // gir.play();                  // error,公有继承下,基类的保护成员对派生类对象不可见  
  45.     // gir.drink();                     // error,公有继承下,基类的私有成员对派生类对象不可见  
  46.       
  47.     // 下面一条语句说明基类成员对派生类的可见性  
  48.     // 派生类(即对派生类的成员函数,派生类的友元函数和有元类可见性,和派生类对象无关)  
  49.     gir.take();   
  50.       
  51.     gir.StrechNeck();  
  52.     return 0;  
  53. }  

2.private继承方式下

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. class Animal  
  4. {  
  5. public:  
  6.     Animal(){}  
  7.     void eat()  
  8.     {  
  9.         cout << "eat/n";  
  10.     }  
  11. protected:  
  12.     void play()  
  13.     {  
  14.         cout << "play/n";  
  15.     }  
  16. private:  
  17.     void drink()  
  18.     {  
  19.         cout << "drink/n";  
  20.     }  
  21. };  
  22. class Giraffe: private Animal  
  23. {  
  24. public:  
  25.     Giraffe(){}  
  26.     void StrechNeck()  
  27.     {  
  28.         cout << "Strech neck /n";  
  29.     }  
  30.     void take()  
  31.     {  
  32.         eat();      // ok,私有继承下,基类的公有成员对派生类可见  
  33. //      drink();    // error,私有继承下,基类的私有成员对派生类不可见,也就是说,派生类不能访问基类私有成员  
  34.         play();     // ok,私有继承下,基类的保护成员对派生类可见  
  35.     }  
  36. };  
  37.   
  38.   
  39. int main()  
  40. {  
  41.     Giraffe gir;  
  42.     // 以下三条语句说明基类成员对派生类对象的可见性  
  43. //  gir.eat();          // error,私有继承下,基类的公有成员对派生类对象不可见  
  44. //  gir.play();         // error,私有继承下,基类的保护成员对派生类对象不可见  
  45. //  gir.drink();                // error,私有继承下,基类的私有成员对派生类对象不可见  
  46.   
  47.     // 下面一条语句说明基类成员对派生类的可见性  
  48.     // 派生类(即对派生类的成员函数,派生类的友元函数和有元类可见性,和派生类对象无关)  
  49.     gir.take();   
  50.   
  51.     gir.StrechNeck();  
  52.     return 0;  
  53. }  

3.protected继承方式下

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. class Animal  
  4. {  
  5. public:  
  6.     Animal(){}  
  7.     void eat()  
  8.     {  
  9.         cout << "eat/n";  
  10.     }  
  11. protected:  
  12.     void play()  
  13.     {  
  14.         cout << "play/n";  
  15.     }  
  16. private:  
  17.     void drink()  
  18.     {  
  19.         cout << "drink/n";  
  20.     }  
  21. };  
  22. class Giraffe: protected Animal  
  23. {  
  24. public:  
  25.     Giraffe(){}  
  26.     void StrechNeck()  
  27.     {  
  28.         cout << "Strech neck /n";  
  29.     }  
  30.     void take()  
  31.     {  
  32.         eat();      // ok,保护继承下,基类的公有成员对派生类可见  
  33. //      drink();    // error,保护继承下,基类的私有成员对派生类不可见,也就是说,派生类不能访问基类私有成员  
  34.         play();     // ok,保护继承下,基类的保护成员对派生类可见  
  35.     }  
  36. };  
  37.   
  38.   
  39. int main()  
  40. {  
  41.     Giraffe gir;  
  42.     // 以下三条语句说明基类成员对派生类对象的可见性  
  43.     //  gir.eat();          // error,保护继承下,基类的公有成员对派生类对象不可见  
  44.     //  gir.play();         // error,保护继承下,基类的保护成员对派生类对象不可见  
  45.     //  gir.drink();        // error,保护继承下,基类的私有成员对派生类对象不可见  
  46.       
  47.     // 下面一条语句说明基类成员对派生类的可见性  
  48.     // 派生类(即对派生类的成员函数,派生类的友元函数和有元类可见性,和派生类对象无关)  
  49.     gir.take();   
  50.       
  51.     gir.StrechNeck();  
  52.     return 0;  
  53. }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
docker-compose 是 Docker 官方的一个用于定义和运行容器化应用的工具。它使用 YAML 文件来配置应用的服务、网络和卷等方面的设置。 当使用 docker-compose 部署 MySQL 时,可能会遇到无法访问 MySQL 的问题。出现这种情况一般有以下几个可能的原因: 1. 网络配置问题:docker-compose 在默认情况下会创建一个默认的网络,并将所有定义的服务连接到该网络。如果服务的网络配置不正确,可能导致无法访问 MySQL。可以通过检查网络配置或创建自定义网络来解决此问题。 2. 端口映射问题:MySQL 默认使用 3306 端口进行通信,但是在容器内部的端口与宿主机上的端口之间可能存在映射问题。可以通过检查端口映射配置或使用容器的 IP 地址来解决此问题。 3. 认证问题:MySQL 服务通常需要进行身份验证才能访问。在 docker-compose 文件中,可以通过设置环境变量来指定 MySQL 的用户名和密码。如果未正确设置这些环境变量,可能导致无法访问 MySQL。可以检查环境变量配置或者在容器内部手动配置用户名和密码来解决此问题。 4. 容器启动顺序问题:如果在 docker-compose 文件中定义了多个服务,并且它们之间有依赖关系,那么容器启动的顺序可能会影响 MySQL 的访问。可以通过在容器之间添加依赖或者设置延迟启动来解决此问题。 总结起来,当 docker-compose 部署的 MySQL 无法访问时,通常是由于网络配置、端口映射、认证配置或容器启动顺序等问题造成的。通过检查这些配置,并进行适当的调整或修复,通常可以解决无法访问 MySQL 的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值