stevendaiy wrote:
> 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
> }
>
I have an old 5th printing of the book, where this example is indeed
supposed to work.
There has been changes to the access rules, like this one:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2563.html#9
Perhaps we should consider this a corner case, that should be avoided?
:-)
Bo Persson
--
[ See http://www.gotw.ca/resources/clcm.htm
for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]


|