C/C++编程:访问控制

你的名字 2022-11-15 03:43 288阅读 0赞

针对成员函数与派生类

声明:下面总结都是在先不管static函数和变量的前提下总结的

private

  • 在类成员列表前面时,private指定只能从类的成员函数或者友元访问这些成员

    class MyClass{

    private :

    1. int data;
    2. void func();

    };

  • 在基类的名称前面时,private指定基类的公共成员和受保护成员是派生类的私有成员

    class MyClass{

    };

    class Drivate: public{

    };

  • 类中成员的默认访问是私有的。 结构或联合中成员的默认访问是公共的。

也就是说:

  1. class myClass {
  2. int a;
  3. }

相当于:

  1. class myClass {
  2. private:
  3. int a;
  4. }

同样,以下代码:

  1. struct myClass {
  2. int a;
  3. }

相当于:

  1. struct myClass {
  2. public:
  3. int a;
  4. }
  • 基类的默认访问对于类是私有的,而对于结构是公共的

也就是说:

  1. class Derived : Base

等效于:

  1. class Derived : private Base

同样,以下代码:

  1. struct Derived : Base

等效于:

  1. struct Derived : public Base

指定私有基类时,建议显式使用 private 关键字,以便派生类的用户理解成员访问权限。

  • 联合不能具有基类

看个例子:

  1. // keyword_private.cpp
  2. class BaseClass {
  3. public:
  4. // privMem accessible from member function
  5. int pubFunc() {
  6. return privMem; }
  7. private:
  8. void privMem;
  9. };
  10. class DerivedClass : public BaseClass {
  11. public:
  12. void usePrivate( int i )
  13. {
  14. privMem = i; } // C2248: privMem not accessible
  15. // from derived class
  16. };
  17. class DerivedClass2 : private BaseClass {
  18. public:
  19. // pubFunc() accessible from derived class
  20. int usePublic() {
  21. return pubFunc(); }
  22. };
  23. int main() {
  24. BaseClass aBase;
  25. DerivedClass aDerived;
  26. DerivedClass2 aDerived2;
  27. aBase.privMem = 1; // C2248: privMem not accessible
  28. aDerived.privMem = 1; // C2248: privMem not accessible
  29. // in derived class
  30. aDerived2.pubFunc(); // C2247: pubFunc() is private in
  31. // derived class
  32. }

protected

声明为protect的类成员,只能由以下项使用

  • 该类的成员函数
  • 该类的友元函数
  • 使用公共或者受保护访问(派生自该类)的派生类
  • 对受保护成员具有专用访问权限的以私有方式派生的类

在基类的名称前面时, protected 关键字指定基类的公共成员和受保护成员都是其派生类的受保护成员。

  1. #include <iostream>
  2. using namespace std;
  3. class X {
  4. public:
  5. void setProtMemb( int i ) {
  6. m_protMemb = i; }
  7. void Display() {
  8. cout << m_protMemb << endl; }
  9. protected:
  10. int m_protMemb;
  11. void Protfunc() {
  12. cout << "\nAccess allowed\n"; }
  13. } x;
  14. class Y : public X {
  15. public:
  16. void useProtfunc() {
  17. Protfunc(); }
  18. } y;
  19. int main() {
  20. // x.m_protMemb; error, m_protMemb is protected
  21. x.setProtMemb( 0 ); // OK, uses public access function
  22. x.Display();
  23. y.setProtMemb( 5 ); // OK, uses public access function
  24. y.Display();
  25. // x.Protfunc(); error, Protfunc() is protected
  26. y.useProtfunc(); // OK, uses public access function
  27. // in derived class
  28. }

public

  • 在类成员列表之前, public 关键字指定可以从任何函数访问这些成员
  • 在基类的名称前面时, public 关键字指定基类的公共成员和受保护成员分别是派生类的公共和受保护成员。
  • 类中成员的默认访问是私有的。 结构或联合中成员的默认访问是公共的。
  • 基类的默认访问对于类是私有的,而对于结构是公共的。 联合不能具有基类。

    class BaseClass {

    public:
    int pubFunc() {

    1. return 0; }

    };

    class DerivedClass : public BaseClass {

    1. };

    int main() {

    BaseClass aBase;
    DerivedClass aDerived;
    aBase.pubFunc(); // pubFunc() is accessible

    1. // from any function

    aDerived.pubFunc(); // pubFunc() is still public in

    1. // derived class

    }

总结

对成员函数






















访问类型 含义
private 只能由类的成员函数、友元(类或函数)使用
protected 由类的成员函数、友元(类或函数)、该类的派生类使用
public 任何函数都可以使用

综上所诉:取交集

注:访问控制同样适用于所有名称:成员函数、成员数据、嵌套类和枚举数。

对派生类

两个因素控制基类的哪些成员可在派生类中访问;这些相同的因素控制对派生类中的继承成员的访问

  • 派生类是否使用public访问说明符声明基类
  • 基类中对成员的访问权限如何

下表显示了这些因素之间的交互以及如何确定基类成员访问

基类中的成员访问


























private protected public
无论派生访问权限如何,始终不可访问 如果使用私有派生,则在派生类中为私有 如果使用私有派生,则在派生类中为私有
如果使用受保护派生,则在派生类中为受保护 如果使用受保护派生,则在派生类中为受保护
如果使用公有派生,则在派生类中为受保护 如果使用公有派生,则在派生类中为公有
  1. // access_specifiers_for_base_classes.cpp
  2. class BaseClass
  3. {
  4. public:
  5. int PublicFunc(); // Declare a public member.
  6. protected:
  7. int ProtectedFunc(); // Declare a protected member.
  8. private: // 任何派生类都无法访问它。
  9. int PrivateFunc(); // Declare a private member.
  10. };
  11. // Declare two classes derived from BaseClass.
  12. class DerivedClass1 : public BaseClass
  13. {
  14. void foo()
  15. {
  16. PublicFunc();
  17. ProtectedFunc();
  18. PrivateFunc(); // function is inaccessible
  19. }
  20. };
  21. class DerivedClass2 : private BaseClass
  22. {
  23. void foo()
  24. {
  25. PublicFunc();
  26. ProtectedFunc();
  27. PrivateFunc(); // function is inaccessible
  28. }
  29. };
  30. int main()
  31. {
  32. DerivedClass1 derived_class1;
  33. DerivedClass2 derived_class2;
  34. derived_class1.PublicFunc();
  35. derived_class2.PublicFunc(); // function is inaccessible
  36. }

在 DerivedClass1 中,成员函数 PublicFunc 是公共成员,ProtectedFunc 是受保护成员,因为 BaseClass 是公共基类。 PrivateFunc 对于 BaseClass 是私有的,因此任何派生类都无法访问它。

在 DerivedClass2 中,函数 PublicFunc 和 ProtectedFunc 被视为私有成员,因为 BaseClass 是私有基类。 同样,PrivateFunc 对于 BaseClass 是私有的,因此任何派生类都无法访问它。

请注意,声明为具有私有访问权限的成员无法访问函数或派生类,除非这些函数或类是使用 friend 基类中的声明声明的。

针对静态成员

在基类指定为private,它只会影响非静态成员。在派生类中,公共静态成员仍是可以访问的。但是,使用指针、引用或者对象访问基类的成员需要转换,此时将再次应用访问控制

针对对象

C/C++编程:protected的访问权限
官方文档

发表评论

表情:
评论列表 (有 0 条评论,288人围观)

还没有评论,来说两句吧...

相关阅读

    相关 nginx访问控制

    nginx访问控制 nginx默认网站为`/nginx/html/index.html`文件 访问控制有两种:允许个别,拒绝所有;允许所有,拒绝个别 允许所有,拒

    相关 Nginx访问控制

    访问控制时网络安全防范和保护的主要策略,其任务是保证网络资源不被非法访问。Nginx作为web服务器的后期之秀,也提供了访问控制的功能。 1、权限控制指令 Nginx中

    相关 访问控制修饰符

    访问控制修饰符 Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。 default (即缺省,什么也不写

    相关 Nginx——访问控制

    访问控制 访问控制是网络安全防范和保护的主要策略,其任务是保证网络资源不被非法访问。Nginx作为Web服务器的后起之秀,也提供了访问控制的功能。它可以根据实际需求,对用