Z
zhangyefei.yefei
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.
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.