From: stevendaiy on
While preparing for a c++ interview, I went through TC++PL(3rd edition,
24th) and studied Appendix C, i.e., technicalities.
Specifically, I found one of the examples is puzzling to me on page 851,
i.e., when a class Y2 is derived from a protected base X class, and another
class Z2 is derived from the public base class Y2, in the memeber function
Z2::f(Y2* py2)
if we tried to do something like

class X{
public:
int a;
};
class Y2: protected X{};
class Z2:public Y2{void f(Y2*);};

void Z2::f(Y2* py2)
{
X* px = this; //OK
px = py2; //error
}
according to the book, the second statement is an error
//error: X is a protected base of Y2, and Z2 is derived from Y2,
//but we don't know if py2 is a Z2 or how Y2::X is used in a non-Z2 object

My first question is that: isn't Y2 a member of Z2 (aka base class), so that
access to X from Y2 is solely based on the relations between Y2 and X.
I think it's equivalent to
void Y2::g(Y2 *py2) //notice Y2:: not Z2::
{
X* px = py2; //OK
}

My second question is that the above two sets of code BOTH compile under
Microsoft VS 2003 and cygwin. It could be a compiler issue though.

Thanks a lot for your time.

Steven


--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]