相同的层次结构,访问基类的受保护成员时具有不同的行为

问题描述 投票:0回答:1

我在上次考试中遇到了这段代码:

#include <iostream>
class cls1
{
protected:
    int x;

public:
    cls1()
    {
        x = 13;
    }
};
class cls2 : public cls1
{
    int y;

public:
    cls2()
    {
        y = 15;
    }
    int f(cls2 ob)
    {
        return (ob.x + ob.y);
    }
};
int main()
{
    cls2 ob;
    std::cout << ob.f(ob);
    return 0;
}

这很好用,并输出28。问题是,它似乎与这段代码(在另一项考试中发现)矛盾:

#include <iostream>
class B
{
protected:
    int x;

public:
    B(int i = 28)
    {
        x = i;
    }
    virtual B f(B ob)
    {
        return x + ob.x + 1;
    }
    void afisare()
    {
        std::cout << x;
    }
};
class D : public B
{
public:
    D(int i = -32)
        : B(i)
    {
    }
    B f(B ob)
    {
        return x + ob.x - 1;/// int B::x is protected within this context
    }
};
int main()
{
    B *p1 = new D, *p2 = new B, *p3 = new B(p1->f(*p2));
    p3->afisare();
    return 0;
}

这是相同类型的层次结构,但是一个可以访问ob.x,而另一个则没有。有人可以向我解释为什么吗?

c++ inheritance protected
1个回答
1
投票

不同之处在于,在第一种情况下,protected成员是通过派生类访问的。在第二种情况下,protected成员是通过基类访问的,这是不允许的。

对于protected members

(重点是我的)

仅可访问类的protected成员

2)到该类的任何派生类的成员protected,但仅当访问受保护成员的对象的类是该派生类或该派生类的派生类时

and friends (until C++17)
© www.soinside.com 2019 - 2024. All rights reserved.