我有一段时间没有完成C ++,也无法弄清楚为什么跟随不起作用:
class A {
protected:
int num;
};
class B : public A {
};
main () {
B * bclass = new B ();
bclass->num = 1;
}
编译它会产生:
错误C2248:'A :: num':无法访问在类'A'
中声明的受保护成员
派生类不应该可以访问受保护的成员吗?
我错过了什么?
答案 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
类中访问B
。 num
必须公开,才能以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中的受保护数据成员。