1.多重繼承下的類作用域名字查找規(guī)則:第一步,編譯器找到一個(gè)匹配的聲明。如果匹配的聲明不止一個(gè),則導(dǎo)致二義性,出錯(cuò);第二步,編譯器確定找到的名字是否合法。
避免二義性的方法:在解決二義性的派生類中定義函數(shù)的一個(gè)版本。
2. 采用虛繼承的方法可以有效減少二義性。定義虛繼承的方法,在派生列表中包含“virtual”。
虛繼承中名字查找方法。設(shè)查找函數(shù)func:(1)如果在每個(gè)路徑中func表示同一基類成員,則沒有二義性,因?yàn)轭惞蚕碓摮蓡T的單個(gè)實(shí)例。(2)如果在某個(gè)路徑中func是虛基類的成員,而在另一路徑上是后代派生類的成員,也沒有二義性,因?yàn)樘囟ㄅ缮悓?shí)例的優(yōu)先級(jí)高于共享虛基類實(shí)例。(3)如果沿每個(gè)繼承路徑func表示后代派生類的不同成員,則具有二義性。
3.虛繼承的特殊初始化方式。通常,每個(gè)類只初始化自己的直接基類。但在虛繼承中也這樣運(yùn)行的話,可能會(huì)多次初始化虛基類。
由最低層(非虛繼承)派生類的構(gòu)造函數(shù)初始化虛基類。(2)任何直接或間接繼承虛基類的類一般也必須為該虛基類提供自己的初始化式,以提供自身對(duì)象初始化使用。
class ZooAnimal{...};
class Bear: public virtual ZooAnimal{...};
class Raccoon: public virtual ZooAnimal{...};
class Endangered{...};
class Panda: public Bear,public Raccoon,public Endangered{...};
在上面的例子中,Panda構(gòu)造函數(shù)初始化Panda,ZooAnimal,Bear,Raccoon,Endangered部分,供Panda對(duì)象使用。Bear(or Raccoon)構(gòu)造函數(shù)初始化Bear(or Raccoon),ZooAnimal部分供Bear(or Raccoon)對(duì)象使用.
4. 虛繼承的構(gòu)造函數(shù)次序。先是全部直接基類的虛基類的構(gòu)造函數(shù)按聲明的順序,然后是非虛基類函數(shù)按聲明的順序運(yùn)行。

文章來源:http://liyuxia-life.spaces.live.com/Blog/cns!DA1B364675ACF35!267.entry