是C ++的新手。
class A
{
public:
int i;
protected: //**--- [1]**
void set()
{
i=5;
cout<<i;
}
};
class B : public A
{
public:
void call()
{
A obj;
obj.set(); //**----[2]**
set(); //**---[3]**
}
};
int main()
{
B* b_obj = new B;
b_obj->call();
}
如果我尝试包含 [2] 并且不将 [1] 替换为public,为什么代码不会被编译?但如果我编译包含 [ 3] 一个人?
编译错误:错误:'void A :: set()'受到保护。
简而言之,我的目的是理解为什么如果基类接口的访问说明符设置为protected,则无法在派生类中调用基础对象。
答案 0 :(得分:2)
不确定我的答案是否正确,但是这里是:
set在A类中受到保护。这意味着没有外部成员可以访问set,但派生类可以。
当在B中自己调用set()时,你在派生类B中调用函数作为派生函数,这意味着编译器会接受这个,因为函数是受保护的(派生类可以访问。)
但是当你定义一个obj,调用obj.set()时,与obj实例有关,调用是在类的外部,因此编译器给出错误的原因。
希望有所帮助。
答案 1 :(得分:1)
Pet
无关至A
或B
,因此是否允许f.set()
取决于Pet
的定义。相比之下,只有set()
才有效,因为它在基类中受到保护,因此可以在派生类中访问。