编程论坛's Archiver

中学者 发表于 2007-10-5 10:28

[原创]学习继承的一些总结

<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 &amp;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>

心跳的感觉 发表于 2007-10-5 11:11

<P>说的很好..在细点就更好了...</P>

csmenglei951 发表于 2007-10-5 11:19

顶了

aipb2007 发表于 2007-10-5 13:05

<P>你讲的跟继承没多大关系,倒是你需要多了解下“作用域”。[em17]</P>

夕已 发表于 2008-4-2 10:57

好像...看不怎么懂啊
呵呵

eagleboycn 发表于 2008-4-2 10:59

看看
学习一下..........
谢谢LZ!

chen_zixi 发表于 2008-4-6 13:36

再详细点就好啦

树上的番茄 发表于 2008-4-29 08:55

能够再详细的就再好不过了~

中学者 发表于 2008-4-29 10:14

那是以前的总结,不够深刻//

mqh21364 发表于 2008-6-28 19:16

不错,顶了

pchen_88 发表于 2008-8-21 12:16

谢谢楼主。。学习了

blueboy82006 发表于 2008-8-21 13:19

[quote][bo][un]中学者[/un] 在 2007-10-5 10:28 的发言:[/bo]

私有继承(默认继承方式)
[/quote]

置疑中...

书生剑客 发表于 2008-8-22 21:52

LZ所说的恰好是我想知道的。。顶了。。

守鹤 发表于 2008-9-3 22:50

加上一点自己的认识就更好了,这些网上都有的

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.