为什么我不能从派生类的实例访问受保护的成员?

时间:2009-06-08 22:32:58

标签: c++ inheritance

我有一段时间没有完成C ++,也无法弄清楚为什么跟随不起作用:

class A {
protected:
  int num;
};

class B : public A {
};

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

编译它会产生:

  

错误C2248:'A :: num':无法访问在类'A'

中声明的受保护成员

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

我错过了什么?

8 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:13)

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

示例:

#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类中访问Bnum必须公开,才能以bclass->num的形式访问它。

答案 2 :(得分:8)

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

答案 3 :(得分:6)

但是你没有从派生类中访问它。你是从main()访问它。

答案 4 :(得分:4)

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

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
}

答案 5 :(得分:3)

“受保护”意味着在成员函数或派生类的成员函数之外进行访问。 “main”函数不是任何一个类的成员,但它试图直接访问成员变量。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

是的,您无法访问main函数中的受保护数据成员。但您可以通过在Derived call中创建函数来访问main中的受保护数据成员。