2009-12-20 64 views
1

假設我有一個具有成員變量A * my_hash的類Base。 我也有類繼承自基類的擴展。我也有一個B類 延伸A.C++設計問題

class Base{ 
    Base(): my_hash(new A) {} 
    //methods which use my_hash 
protected: 
    A* my_hash; 

}; 

class Extended:public Base{ 
//methods which use my_hash from A 
//I cannot have a B* my_other_hash in this class 
//I would like to substitute B* my_hash 
//I cannot let Base create my_hash (of type A*) because that is not what I want. 
}; 

我想擴展到做平常(即使用它從一個繼承的所有內容),除 並有一個重要的區別,我想my_hash爲B * 代替*。
每當有東西訪問my_hash,無論是通過擴展的方法或基地的方法, 我希望被執行的方法是B *的。

有一件事要嘗試: 我不能在Extended()中重新定義方法調用(例如Base()中的create_hash())。 這不起作用,因爲在創建哈希時似乎沒有辦法恢復到擴展類。

我不喜歡Base甚至不知道B怎麼做?

+0

B從A派生出來嗎?或者:B和A有什麼關係? – 2009-12-20 23:40:04

+0

@ Federico:它在第一段中寫道:「我也有一個B類延伸A.」 – 2009-12-20 23:49:28

+0

用下面的答案,確保類A中有虛方法,這樣如果通過類A的指針調用該方法,則會執行B的方法。 – Jagannath 2009-12-21 08:34:42

回答

4

如果「B」的類型擴展「A」,那麼你可以設定,讓你通過了「m_hash值'通過構造函數(你也可以隱藏這個構造函數作爲受保護的,所以沒有從'Base'繼承的代碼不能擴展它)。

例如

class Base{ 
    Base(): my_hash(new A) {} 
    //methods which use my_hash 
protected: 

    A* my_hash; 
    Base(A* hash): my_hash(hash) {} 
}; 

class Extended:public Base{ 
public: 
    Extended() : Base(new B) {} 
}; 

另外,如果你想在「B」新的,特殊的功能,你可以從「擴展」,打電話,那麼你可以存儲在另一個指針或只投'my_hash爲鍵入「B *」 。

0

正如Autopulated所建議的,模板可能是這裏的一種方式。另一種做法是事實上有一個B * my_other_hash(就像你在問題中提到的那樣),然後在B的ctor中將my_other_hash設置爲my_hash。

class Extended:public Base{ 
    ExtendedBase(): Base() { 
     my_other_hash = my_hash; 
    } 
} 

然後,您可以訪問Base中的A方法和Extended中的A或B方法。確保只刪除其中一個!如果您在其他地方管理內存,則可以在Base的Dtor或層次結構之外。