我在过去的一次考试中遇到了这段代码:
#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
,而另一个则不能。有人可以向我解释为什么吗?