上一篇:http://www.BkJia.com/kf/201201/115850.html
17.3.5 虛繼承
在C++中,通過使用虛繼承(virtual inheritance)解決這類問題。虛繼承是一種機制,類通過虛繼承指出它希望共享其虛基類的狀態。在虛繼承下,對給定虛基類,無論該類在派生層次中作為虛基類出現多少次,只繼承一個共享的基類子對象。共享的基類子對象稱為虛基類(virtual base class)。
通過在派生列表中包含關鍵字virtual設置虛基類。
namespace Andersoft
{
namespace Animal
{
class ZooAnimal{
};
class Endangered{
};
class Bear:virtual public ZooAnimal{
};
class Raccon:virtual public ZooAnimal{
};
class Panda:public Bear,public Endangered, public Raccon{
public:
Panda():Bear(),Endangered(),Raccon(){}
};
}
}
namespace Andersoft
{
namespace Animal
{
class ZooAnimal{
};
class Endangered{
};
class Bear:virtual public ZooAnimal{
};
class Raccon:virtual public ZooAnimal{
};
class Panda:public Bear,public Endangered, public Raccon{
public:
Panda():Bear(),Endangered(),Raccon(){}
};
}
}實際上,中間基類指定其繼承為虛繼承的要求很少引起任何問題。通常,使用虛繼承的類層次是一次性由一個人或一個項目設計組設計的,獨立開發的類很少需要其基類中的一個是虛基類,而且新基類的開發者不能改變已經存在的層次。
17.3.6 虛基類的聲明
通過關鍵字virtual修改聲明,將基類指定為通過虛繼承派生。
class ZooAnimal{
};
class Endangered{
};
class Bear:virtual public ZooAnimal{
};
class Raccon:virtual public ZooAnimal{
};
class Panda:public Bear,public Endangered, public Raccon{
public:
Panda():Bear(),Endangered(),Raccon(){}
};
class ZooAnimal{
};
class Endangered{
};
class Bear:virtual public ZooAnimal{
};
class Raccon:virtual public ZooAnimal{
};
class Panda:public Bear,public Endangered, public Raccon{
public:
Panda():Bear(),Endangered(),Raccon(){}
};指定虛派生只影響從指定了虛基類的類派生的類。除了影響派生類自己的對象之外,它也是關於派生類與自己的未來派生類的關系的一個陳述。
virtual說明符陳述了在後代派生類中共享指定基類的單個實例的願望。
任何可被指定為基類的類也可以被指定為虛基類,虛基類可以包含通常由非虛基類支持的任意類元素。
1. 支持到基類的常規轉換
即使基類是虛基類,也通常可以通過基類類型的指針或引用操縱派生類的對象。
2. 虛基類成員的可見性
使用虛函數的多重繼承層次比沒有虛繼承的引起更少的二義性問題。
可以無二義性地直接訪問共享虛基類中的成員。同樣,如果只沿一個派生路徑重定義來自虛基類的成員,則可以直接訪問該重定義成員。在非虛派生情況下,兩種訪問都可能是二義性的。
如果在某個路徑中x是虛基類的成員,而在另一路徑中x是後代派生類的成員,也沒有二義性——特定派生類實例的優先級高於共享虛基類實例。
17.3.7 特殊的初始化含義
在虛派生中,由最低層派生類的構造函數初始化虛基類。
雖然由最低層派生類初始化虛基類,但是任何直接或間接繼承虛基類的類一般也必須為該基類提供自己的初始化式。只要可以創建虛基類派生類類型的獨立對象,該類就必須初始化自己的虛基類,這些初始化式只在創建中間類型的對象時使用。
2. 構造函數與析構函數次序
無論虛基類出現在繼承層次中任何地方,總是在構造非虛基類之前構造虛基類。
摘自 xufei96的專欄