<P>什么是两义性:当一个派生类是<FONT color=#0000ff>多重派生</FONT>也就是由多个基类派生而来时,假如这些基类中的成员有成员名相同的情况,<FONT color=#ff0000>如果使用一个表达式引用了这些同名的成员</FONT>,就会造成无法确定是引用哪个基类的成员,<FONT color=#ff0000>这种对基类成员的访问就是<FONT color=#0000ff>两义性</FONT>的</FONT>。</P>' G5 O( Y. [4 G) J- i% G
<P>要避免在派生类定义及使用时出现两义性的情况,我们可以使用<FONT color=#0000ff>成员名限定</FONT>来消除两义性,也就是在成员名前<FONT color=#ff0000>用对象名及基类名来限定</FONT>,如:</P>. X8 A9 \* V/ a/ N3 r* j& j
<P>obj.A::func( );//A的func( );</P>9 u9 \% B2 Z0 u# Y+ k; D. y7 v
<P>obj.B::func( );//B的func( );</P>
' c8 A; u; q6 Z) J2 b2 k8 I7 b<P><B>C++作用域规则</B>:就是当基类中的成员名字在派生类中再次声明,则派生类中的名字就屏蔽掉基类中相应的名字(也就是派生类的自定义成员与基类成员同名时,派生类的成员优先)。那么如果要使用被屏蔽的成员呢? 这就要由作用<FONT color=#0000ff>域分辨操作符</FONT>实现了。它的形式是 <FONT color=#0000ff>类名 ::类标识符</FONT> 。作用域分辨不仅可以用在<FONT color=#0000ff>类</FONT>中,而且可以用在<FONT color=#0000ff>函数调用</FONT>时。</P>- ?" V1 d4 x7 V) d0 x+ a
<P><FONT face=黑体>支配规则</FONT>:课本上的定义是:类X中的名字N支配类中同名的名字N,是指类Y为它的一个基类,这称为支配规则。我们可以理解为一个派生类中的名字将优先于与它的基类中相同的名字。这时二者之间不存在两义性,当选择该名字时,使用支配者(派生类中)的名字 。支配规则是对名字而言的。 </P>
6 T5 B+ a/ L! j1 ]. R<P>如果一个<FONT color=#0000ff>派生类</FONT>从<FONT color=#ff0000>多个基类</FONT>中派生,而这些基类又有一个<FONT color=#ff0000>共同的基类</FONT>,则在这个派生类中<FONT color=#ff0000>访问这个共同基类</FONT>中的成员时会产生<FONT color=#0000ff>两义性</FONT>。</P>0 W8 _8 k) e' k2 y5 A
<P>为了避免两义性,应使用<FONT color=#0000ff>作用域分辨操作符</FONT>来实现。一般只有在派生类中使用的标识符与基类中的标识符时,才有必要使用作用域分辨符进行存取。</P> |