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