[原创]学习继承的一些总结
<P>*/ --------------------------------------------------------------------------------------<BR>*/ 出自: 编程中国 http://www.bc-cn.net<BR>*/ 作者: 中学者 <BR>*/ 时间: 2007-10-5 编程论坛首发<BR>*/ 声明: 尊重作者劳动,转载请保留本段文字<BR>*/ --------------------------------------------------------------------------------------<BR><BR><BR> 作为新手,想必可能有和我遇到同样问题的。希望这篇文章对大家有帮助,也希望这篇文章大家能对我有帮助。学习继承,我主要总结了关于成员可见性的问题。。<BR><BR> 作为继承,主要有三种:公有继承,私有继承(默认继承方式),保护继承。<BR>公有继承:<BR> 基类中的公有成员在派生类中仍公有;<BR> 基类中的保护成员在派生类中仍保护;<BR> 基类中的私有成员在派生类中不可见,仅基类可见。<BR><BR>私有继承:<BR> 基类中的公有成员在派生类中为私有;<BR> 基类中的保护成员在派生类中为私有;<BR> 基类中的私有成员在派生类中不可见,仅基类可见。<BR><BR>保护继承:<BR> 基类中的公有成员在派生类中为保护;<BR> 基类中的保护成员在派生类中为保护;<BR> 基类中的私有成员在派生类中不可见,仅基类可见。<BR>通过继承机制,派生类继承了基类的成员,所继承的成员只属于派生类,即基类和派生类各有一份这样的成员,这点很重要。<BR>接下来,我们不慌看继承,回到类来看:(个人理解所谓可见性即是调用权限!)<BR></P><DIV class=htmlcode>
<P>#include《iostream》<BR>using namespace std;<BR> class A{<BR>public:<BR> void dump()const{....}<BR>protected:<BR> void set(){......}<BR>private:<BR> void get(){.......}<BR>};<BR>int main()<BR>{<BR> A a;<BR> a.dump();//ok!<BR> /* a.set(); */ //wrong!<BR> /* a.get(); */ //wrong!<BR>return 0;<BR>}<BR>函数set()和get()在main函数中都不能调用,说明它们的调用权限仅属于类,即对main不可见。同理可知dump().<BR></P></DIV>
<P>下面我们以公有继承为例:<BR></P>
<DIV class=htmlcode>#include《iostream》<BR>using namespace std;<BR>class A{<BR>public:<BR> void dump()const{....}<BR>protected:<BR> void get_x(){x++;}<BR>private:<BR> int x;<BR>};<BR>class B:public A<BR>{<BR>public:<BR> void get(){ get_x();}<BR> /* void get_y(){ y=x;} */<BR> void compare(A &a){ a.get_x();}<BR>protected:<BR> void set(){...}<BR>private:<BR> int y;<BR>};<BR>int main()<BR>{<BR> B b;<BR> A a;<BR>/* b.get_y(); */ //wrong! x在B类不可见,不能访问.<BR><BR> b.get();//ok! 由于x是私有的,所以派生类不可见,但能间接访问.<BR><BR>/* b.compare(a); */ //wrong!这个是我之前一直没想通的,但是现在清楚了。因为对象a调用的get_x()权限仅属于A,所以对B不可见。<BR><BR>return 0;<BR>}<BR><BR>于是我们知道,在派生类不可见的成员并不是不可访问的,可以通过间接的方式访问!</DIV>
<P>总结上面的,做了一张表:(注:派生类中成员的可见性是指继承来的和自身添加的成员。)</P>
<TABLE borderColor=#cccccc cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=1>
<TR>
<TD>
<P align=center> 成员</P></TD>
<TD>
<P align=center> 基类(类)</P></TD>
<TD>
<P align=center> 派生类</P></TD>
<TD>
<P align=center> main</P></TD></TR>
<TR>
<TD>
<P align=center> 私有数据</P></TD>
<TD>
<P align=center> 可见</P></TD>
<TD>
<P align=center> 不可见</P></TD>
<TD>
<P align=center> 不可见</P></TD></TR>
<TR>
<TD>
<P align=center> 私有函数</P></TD>
<TD>
<P align=center> 可见</P></TD>
<TD>
<P align=center> 不可见</P></TD>
<TD>
<P align=center> 不可见</P></TD></TR>
<TR>
<TD>
<P align=center> 保护数据</P></TD>
<TD>
<P align=center> 可见</P></TD>
<TD>
<P align=center> 可见</P></TD>
<TD>
<P align=center> 不可见</P></TD></TR>
<TR>
<TD>
<P align=center> 保护函数</P></TD>
<TD>
<P align=center> 可见</P></TD>
<TD>
<P align=center> 可见</P></TD>
<TD>
<P align=center> 不可见</P></TD></TR>
<TR>
<TD>
<P align=center> 公有数据</P></TD>
<TD>
<P align=center> 可见</P></TD>
<TD>
<P align=center> 可见</P></TD>
<TD>
<P align=center> 可见</P></TD></TR>
<TR>
<TD>
<P align=center> 公有函数</P></TD>
<TD>
<P align=center> 可见</P></TD>
<TD>
<P align=center> 可见</P></TD>
<TD>
<P align=center> 可见</P></TD></TR></TABLE><BR> <P>说的很好..在细点就更好了...</P> 顶了 <P>你讲的跟继承没多大关系,倒是你需要多了解下“作用域”。[em17]</P> 好像...看不怎么懂啊
呵呵 看看
学习一下..........
谢谢LZ! 再详细点就好啦 能够再详细的就再好不过了~ 那是以前的总结,不够深刻// 不错,顶了 谢谢楼主。。学习了 [quote][bo][un]中学者[/un] 在 2007-10-5 10:28 的发言:[/bo]
私有继承(默认继承方式)
[/quote]
置疑中... LZ所说的恰好是我想知道的。。顶了。。 加上一点自己的认识就更好了,这些网上都有的
页:
[1]
