大多數應用程序使用單個基類的公用繼承,但是在某些情況下,單繼承是不夠的,必須使用多繼承,當然多繼承也會帶來很多的麻煩,下面列出了多繼承的一些要點和注意事項。
1.基類的構造函數與按照派生類列表中出現的次序調用,析構函數的調用次序總是和構造函數的調用次序相反。
2.多重繼承的情況下,遇到二義性的可能將會更大,編譯器不會試圖根據派生類轉換區別基類間的轉換,轉換成每個基類都一樣好,有如下代碼:
class ZooAnimal
{
};
class Bear : public ZooAnimal
{
};
class Endangered
{
};
class Panda : public Bear, public Endangered
{
};
如果有print函數的兩個重載版本:
void print(const Bear&);
void print(const Endangered&);
這個調用將會出錯,編譯器將指出改掉用有二義性。
3.假定在類的多個基類中定義了相同的成員,將會導致二義性,如果定義了同名的成員函數,即使是函數參數不同,也會導致二義性,代碼如下:
class ZooAnimal
{
};
class Bear : public ZooAnimal
{
public:
void print(int x){cout<<"print"<<endl;}
};
class Endangered
{
public:
void print(){cout<<"print"<<endl;};
};
class Panda : public Bear, public Endangered
{
};
如果在ZooAnimal中定義了print 而Bear中沒有定義,同樣會出現二義性。避免二義性的最好方法就是指定函數的作用域,比如:
Bear::print(x);