C ++:为什么在受保护的类中无法访问基类对象

时间:2013-05-31 09:09:14

标签: c++ object base

是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,则无法在派生类中调用基础对象。

2 个答案:

答案 0 :(得分:2)

不确定我的答案是否正确,但是这里是:

set在A类中受到保护。这意味着没有外部成员可以访问set,但派生类可以。

当在B中自己调用set()时,你在派生类B中调用函数作为派生函数,这意味着编译器会接受这个,因为函数是受保护的(派生类可以访问。)

但是当你定义一个obj,调用obj.set()时,与obj实例有关,调用是在类的外部,因此编译器给出错误的原因。

希望有所帮助。

答案 1 :(得分:1)

Pet 无关AB,因此是否允许f.set()取决于Pet的定义。相比之下,只有set()才有效,因为它在基类中受到保护,因此可以在派生类中访问。