繼承是面向對象的三大特征之一。但是對於繼承的實現和使用方式,各種不同的面向對象語言有各自的觀點。有些語言支持多重繼承,而有些語言則只支持單一繼承。
多重繼承的確引入了較大的復雜度。那麼,在不得已使用的時候,需要注意幾個方面的處理方式,才能使代碼更加高效易懂
對於多個父類中出現同名的函數,最好的處理方法是為這些父類新添一個輔助類,在輔助類中用不同的函數名字來封裝同名函數。這樣可以更加輕松的調用這些同名函數。
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繼承的方式攻克鑽石型繼承
vcq9wLSx3MPituC33UHA4MTayN21xLP2z9ahozwvcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">class CSofa
{
public:
virtual void Clean();
};
class CBed
{
public:
virtual void Clean();
};
class CSofaBed : public virtual CSofa, public virtual CBed
{
public:
};