2013-04-07 145 views
3

我遇到了繼承問題,我不知道我的解決方案是否優雅。我有這樣的類覆蓋類成員變量

class Var 
{ 
public: 
    virtual void doSomething(); 
} 
class DerivedVar : public Var 
{ 
public: 
    virtual void doSomething(); 
    void doSomethingElse(); 
} 

我也有MyDerived繼承自MyBase。 MyBase有Var類型的成員,而MyDerived需要有DerivedVar的成員,因此可以調用doSomething()。目前,我使用模板來解決這個問題

template<typename VarType> 
class MyBase 
{ 
protected: 
    VarType var; 
public: 
    MyBase() { var.doSomething(); } 
} 

class MyDerived : public MyBase<DerivedVar> 
{ 
public: 
    MyDerived() : MyBase() { var.doSomethingElse(); } 

} 

我想知道是否有更好的方法來做到這一點(例如,而不需要使用模板)如果你希望或需要

+1

如果您不知道CRTP,您可能會發現有關CRTP的內容。 – chris 2013-04-07 17:17:39

+0

那麼......如果你不需要在堆上添加一個間接和分配級別,你總是可以存儲一個指針...... – StoryTeller 2013-04-07 17:20:34

回答

1

避免模​​板化,那麼你需要動態地分配協變類型的數據成員。

然後一個好方法是將工廠傳遞給構造函數鏈(它可以是一個默認的構造函數參數),然後在基類中調用它。

ungood方法,但在90年代初非常流行,是使用兩階段初始化。

好吧,我預料到你還沒有遇到的問題。

但是你會的。 ;-)

這就是說,如果你可以使模板方法的工作,這可能是最好的。

最直接的解決方案,最少量的解決方法以及代碼和設計自適應。