我試圖實現以下繼承關係。聯盟虛擬繼承
Variable
/ \
... GlobalVar LocalVar ...
\ /(either)
ExtendedVar // Essentially with more fields
我基本上希望它延長Variable
子類中的一個,而選擇在運行時做出。虛擬繼承並不能完全解決問題。如果ExtendedVar
繼承GlobalVar
和LocalVar
,並且當我需要調用某個成員funciton時,我無法指定要爲該函數使用哪個基類。
此代碼似乎工作。
class ExtendedVar : public Variable /* ExtendedVar is-a Variable */ {
Variable& var; // wraps a var in it. This is the var to extend.
std::string some_field;
}
但它在繼承中帶有一個不必要的副本。或者我可以再多上幾門課,例如ExtendedGlobalVar
和ExtendedLocalVar
,這對維護顯然是不利的。
有沒有更好的選擇?
https://stackoverflow.com/questions/49002/prefer -composition-over-inheritance – CoryKramer
這實際上並不十分清楚你想要做什麼,但是你可能需要''D''中的成員'A *'(或者某個智能變體或'A&')而不是繼承。 –
@CoryKramer,感謝您的鏈接,但我希望A的全部接口,並擴展A的子類之一... – YiFei