繼承是面向對象的三大特徵之一。但是對於繼承的實現和使用方式,各種不同的面嚮對象語言有各自的觀點。有些語言支持多重繼承,而有些語言則只支持單一繼承。
多重繼承的確引入了較大的複雜度。那麼,在不得已使用的時候,需要注意幾個方面的處理方式,才能使代碼更加高效易懂
- 封裝同名函數
對於多個父類中出現同名的函數,最好的處理方法是爲這些父類新添一個輔助類,在輔助類中用不同的函數名字來封裝同名函數。這樣可以更加輕鬆的調用這些同名函數。
class CSofa
{
public:
// 同名函數
virtual void Clean();
};
class CBed
{
public:
// 同名函數
virtual void Clean();
};
// 輔助類
class AuxSofa : public CSofa
{
public:
virtual void CleanSofa() = 0;
// 轉接到新接口
virtual void Clean() { CleanSofa(); }
};
// 輔助類
class AuxBed : public CBed
{
public:
virtual void CleanBed() = 0;
// 轉接到新接口
virtual void Clean() { CleanBed(); }
};
class CSofaBed : public AuxSofa, public AuxBed
{
public:
// 清晰明確的接口名字,避免了同名困擾
virtual void CleanBed();
virtual void CleanSofa();
};
- 利用virtual繼承的方式攻克鑽石型繼承
此類繼承,D類往往會持有兩份A類的數據,造成空間的巨大浪費。可以利用virtual繼承的方式來避免多份A類內容的出現。
class CSofa
{
public:
virtual void Clean();
};
class CBed
{
public:
virtual void Clean();
};
class CSofaBed : public virtual CSofa, public virtual CBed
{
public:
};