派生关系中的重名成员的处理(二义性问题)

前面我们介绍了派生与继承关系,它们把不同的类联系在了一起,很容易就产生了一个重名成员的处理问题,我们称之为“派生关系中的二义性问题”。下面分几种情形来介绍:

1.基类与派生类间重名成员的处理

规则:重名成员不加类名限定默认是派生类成员;要访问基类重名成员则要采用类名限定的方法。

派生关系中的重名成员的处理(二义性问题)_第1张图片

2.多重继承情况下基类重名成员的处理

规则:重名成员不加类名限定默认是派生类成员;要访问基类重名成员则要采用类名限定的方法。(同上)

派生关系中的重名成员的处理(二义性问题)_第2张图片

3.多级混合继承(非虚拟继承)情况下“爷爷类”重名成员的处理

规则:重名成员不加类名限定默认是派生类成员;要访问基类重名成员则要采用类名限定的方法。(同上)

对最底层的派生类而言,如果父类和“爷爷类”都有同名成员,访问“爷爷类”会出现一些错误,详见多级继承中同名成员的访问。因此这里我们只讨论简单的情况,即“爷爷类”和子类有重名成员的情况。

派生关系中的重名成员的处理(二义性问题)_第3张图片

4.多级混合继承(虚拟继承)情况下“爷爷类”只有一个,不会出现重名成员的情况,无需进行处理

方法:将“爷爷类”定义为虚基类,各派生类对象共享其同一个“爷爷”。这种继承称为共享继承。

class A{...};
class B: virtual public A{...};
class C: virtual public A{...};
class D: public B, public C{...};

派生关系中的重名成员的处理(二义性问题)_第4张图片

你可能感兴趣的:(C++)