1.多重继承下的类作用域名字查找规则:第一步,编译器找到一个匹配的声明。如果匹配的声明不止一个,则导致二义性,出错;第二步,编译器确定找到的名字是否合法。
避免二义性的方法:在解决二义性的派生类中定义函数的一个版本。
2. 采用虚继承的方法可以有效减少二义性。定义虚继承的方法,在派生列表中包含“virtual”。
虚继承中名字查找方法。设查找函数func:(1)如果在每个路径中func表示同一基类成员,则没有二义性,因为类共享该成员的单个实例。(2)如果在某个路径中func是虚基类的成员,而在另一路径上是后代派生类的成员,也没有二义性,因为特定派生类实例的优先级高于共享虚基类实例。(3)如果沿每个继承路径func表示后代派生类的不同成员,则具有二义性。
3.虚继承的特殊初始化方式。通常,每个类只初始化自己的直接基类。但在虚继承中也这样运行的话,可能会多次初始化虚基类。
由最低层(非虚继承)派生类的构造函数初始化虚基类。(2)任何直接或间接继承虚基类的类一般也必须为该虚基类提供自己的初始化式,以提供自身对象初始化使用。
class ZooAnimal{...};
class Bear: public virtual ZooAnimal{...};
class Raccoon: public virtual ZooAnimal{...};
class Endangered{...};
class Panda: public Bear,public Raccoon,public Endangered{...};
在上面的例子中,Panda构造函数初始化Panda,ZooAnimal,Bear,Raccoon,Endangered部分,供Panda对象使用。Bear(or Raccoon)构造函数初始化Bear(or Raccoon),ZooAnimal部分供Bear(or Raccoon)对象使用.
4. 虚继承的构造函数次序。先是全部直接基类的虚基类的构造函数按声明的顺序,然后是非虚基类函数按声明的顺序运行。
文章来源:http://liyuxia-life.spaces.live.com/Blog/cns!DA1B364675ACF35!267.entry