C+基础 --菱形继承--虚继承
1.关于虚继承
首先我们了解什么是多继承,所谓多继承就是一个派生类继承自多个基类,因此多继承可能产生的问题就是菱形继承,比如B和C继承于A,D继承于B和D,因此出现了菱形继承,因此我们再使用D的变量的时候就不确定 这个数据成员到底是通过 A->B->D还是A->C->D这条路径继承而来,就容易发生歧义,一般我们可以再变量面前加上类名解决歧义,另一方面我们可以使用虚继承:这样再次菱形继承时就不会出现上述的问题,虚继承的一个作用就是保证一个类做出申明,无论被继承多少次,他的派生类的数据成员只能出现一次,也就是虚基类的数据成员只在派生类中出现一次。
具体的实例有 iostream ,首先iostream都继承于istream和ostream而 istream和ostream都虚继承于 base_os,这样就可以保证iostream不会出现两次base-os的数据成员。
最后一点是二义性问题,
我们假设A中定义了X数据成员,我们用D访问X因此可能的情况就是
1.B D中都没有定义X,只有A定义了X,那么 就是X就被解析承A的成员
2.B和D中有一个定义了X,因为虚派生类的优先级大于虚基类,那么就会被解析为虚基类的数据成员
3.如果B和D中都定义了X,那么就不确定是哪个虚派生类,那么就会产生二义性。