On Aug 22, 11:59*am, "zhangyefei.ye...@gmail.com"
<zhangyefei.ye...@gmail.comwrote:
Quote:
i read book <effective *c++>,it tell me that public inheritance means
is-a *,and *private inheritance means is-implemented-in-terms-of.
but today i am puzzled by some strange codes.
>
the following program can not pass compiling , bailing :
g++ * * d.cpp * -o d
d.cpp: In function `int main()':
d.cpp:27: error: `a' is an inaccessible base of `b'
>
it is obviously okay to understand,because *private inheritance is-
implemented-in-terms-of.
>
#include <iostream>
using namespace std;
>
class a
{
public:
* * * * virtual void doit() {cout<<"a\n";};
>
};
>
class b: private a
{
public:
* * * * void doit() {cout<<"b\n";}
>
};
>
class c
{
public:
* * * * void set(a * pa) { m_a =pa;m_a->doit();};
* * * * a * m_a;
>
};
>
int main ()
{
* * * * c cc;
* * * * cc.set(new b);
* return 0;
>
}
>
but when *i change source code sightly ,still with *private
inheritance, everything is ok,this surprise me.
>
#include <iostream>
using namespace std;
>
class a
{
public:
* * * * virtual void doit() {cout<<"a\n";};
>
};
>
class c
{
public:
* * * * void set(a * pa) { m_a =pa;m_a->doit();};
* * * * a * m_a;
>
};
>
class b: a
{
public:
* * * * void doit() {cout<<"b\n";}
* * * * void go() { *c cc;cc.set(this);};
>
};
>
int main ()
{
* * * * b bb;
* * * * bb.go();
* return 0;
>
}
>
the above two program seem *same to me,but the results arte complete
different.
why ? can anyone do me a favor of *giving *any hints ?
thanks.
In the first program you are
1. Creating an object of type b.
2. Using type b to access function of type a via the inheritance .
Now since a has been privately inherited the compiler does not
allow you to do so.
In the second program you are
1. Creating an object of type b.
2. Calling a public member of class b (i.e. go())
3. In member go() you have created an object of type c (i.e. cc) and
calling member set() for this object of cc.
4. When the object of cc is created it already has a pointer to type a
and the compiler will copy the contents of
object b (i.e. formal argument of set()) to the actual argument
(i.e pointer to a).
Here you are not trying to access the contents of a via the
inheritance and hence the compiler is not complaining.
I hope my explanation was clear.
Regards,
Prasad