2

我是 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]替换为公共但如果我单独编译包含[3]它可以工作,为什么不编译代码?

编译错误:错误:'void A::set()' 受保护。

简而言之,我的目的是了解如果基类接口的访问说明符设置为受保护,为什么不能在派生类中调用基对象。

4

2 回答 2

2

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

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

当在 B 中单独调用 set() 时,您正在将该函数作为派生类 B 中的 A 的派生函数调用,这意味着编译器将接受这一点,因为该函数是受保护的(派生类可以访问。)

但是,当您定义 A obj,调用 obj.set(),与 obj 实例相关时,该调用在类外部,因此编译器会给出错误。

希望有帮助。

于 2013-05-31T09:29:44.950 回答
1

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

于 2013-05-31T09:12:30.367 回答