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