【问题标题】:Why can't I access a protected member from an instance of a derived class?为什么我不能从派生类的实例访问受保护的成员?
【发布时间】:2009-06-08 22:32:57
【问题描述】:

我有一段时间没有使用 C++ 了,不知道为什么以下方法不起作用:

class A {
protected:
  int num;
};

class B : public A {
};

main () {
  B * bclass = new B ();
  bclass->num = 1;
}

编译生成:

错误 C2248:“A::num”:无法访问在“A”类中声明的受保护成员

派生类不应该访问受保护的成员吗?

我错过了什么?

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

    是的,派生类可以访问受保护的成员,但您在 main() 函数中访问它,该函数位于层次结构之外。如果你在 B 类中声明一个方法并访问 num 就可以了。

    【讨论】:

    • 谢谢!我现在看到了我的错误
    【解决方案2】:

    是的,派生类可以访问受保护的成员,但只能从类内部访问。

    示例:

    #include <iostream>
    
    class A { 
       protected:
       int num;
    };
    
    class B : public A {    public:
       void printNum(){
          std::cout << num << std::endl;
       }
    
    };
    
    main () {
       B * bclass = new B ();
       bclass->printNum();
    }
    

    将打印出num 的值,但num 是从类B 中访问的。 num 必须被声明为 public 才能以 bclass-&gt;num 的身份访问它。

    【讨论】:

      【解决方案3】:

      在 B 的函数范围内可以访问它,但您正试图在 main 中访问它。

      【讨论】:

        【解决方案4】:

        但是您没有从派生类访问它。您正在从 main() 访问它。

        【讨论】:

          【解决方案5】:

          使用类时,受保护成员和私有成员之间确实没有区别。任何使用该类的东西都无法访问。

          class A {
              private: int privateNum;
          
              protected: int protectedNum;
          
              public:  int publicNum;
          
              void SetNumbers(int num) {
                  privateNum = num; //valid, private member can be accessed in member function
                  protectedNum = num; //valid, protected member can be accessed in member function
              }
          };
          
          void main() {
              A classA;
              classA.privateNum = 1; //compile error can't access private member
              classA.protectedNum = 1; //compile error can't access protected member
              classA.publicNum = 1; //this is OK
              classA.SetNumbers(1);  //this sets the members not accessible directly
           }
          

          当您从具有受保护成员的类继承时,差异就会生效。

          class B : public A {
          };
          

          基类的所有私有成员仍然是私有的,派生类将无法访问。另一方面,受保护的成员可以被继承的类访问,但在继承的类之外仍然无法访问。

          class B : public A {
           public:
             void SetBNumbers(int num) {
                 privateNum = num; //compile error, privateNum can only be accessed by members of A, not B
                 protectedNum = num; //this works, as protected members can be accessed by A and B
             }
          };
          
          void main() {
            B classB;
            classB.publicNum = 1; //valid, inherited public is still public
            classB.protectedNum = 1; //compile error, can't access protected member
            classB.privateNum = 1; //compile error, B doesn't know that privateNum exists
            classB.SetBNumbers(1); //this sets the members not accessible directly
          }
          

          【讨论】:

            【解决方案6】:

            “受保护”是指防止成员函数或派生类的成员函数之外的访问。 “main”函数不是任一类的成员,但它试图直接访问成员变量。

            【讨论】:

              【解决方案7】:

              您看到的正是预期的结果。试试这个 - http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/ 获取有关继承访问说明符的信息。

              【讨论】:

                【解决方案8】:

                是的,您不能在 main 函数中访问受保护的数据成员。但是您可以通过在 Derived 调用中创建函数来访问 main 中的受保护数据成员。

                【讨论】:

                  猜你喜欢
                  • 2013-03-05
                  • 2018-10-21
                  • 2015-06-09
                  • 1970-01-01
                  • 2013-09-17
                  • 2018-11-27
                  • 2018-04-17
                  相关资源
                  最近更新 更多