2010-08-18 120 views
2

這個問題最好用代碼描述。我有一個名爲Vertex類,它包含一個名爲Params類的一個實例:C++:重寫純虛擬成員變量?

class Params { 
    virtual Params operator + (Params const& p) = 0; 
}; 

class Vertex { 
    public: 
     Params operator + (Params const& ap) const { 
      return p + ap 
     }; 

     virtual float eval() = 0; 

    private: 
     Params const p; 
}; 

我也有一個名爲EllParams類,這是從ParamsEllVertex這是從Vertex得出的。我想知道的是如何處理私人成員變量pVertexEllVertex:我希望它是EllParams類型。有沒有辦法讓p虛擬/覆蓋它?或者我應該尋找一種解決方案的模板?

+0

有沒有辦法讓數據成員'虛擬'。我會盡量避免在繼承樹的非葉類中的數據成員;如果您需要從基類訪問數據成員,那麼創建一個可以在派生類中實現的虛函數。 – 2010-08-18 17:42:14

+0

您正在嘗試使用抽象類型的數據成員。這是行不通的。改用指針(你可能想使用智能指針)。這樣,虛擬行爲將起作用。 – 2010-08-18 17:57:45

回答

1

那麼...你需要初始化 Vertex莫名其妙。所以在Vertex的構造函數中使它成爲一個參數。然後你的EllVertex會從其構造函數傳遞一個EllParams父構造函數,這將是私人Vertex.p如何初始化。

例如:我已經改變了p成員變量的指針

class Params { 
    virtual Params operator + (Params const& p) = 0; 
}; 

class Vertex { 
    public: 
     Params operator + (Params const& ap) const { 
      return *p + ap 
     }; 

     virtual float eval() = 0; 

    protected: 
     Vertex(Params* inputParams) : p(inputParams) {} 

    private: 
     Params* const p; 
}; 

通知。這樣,您不必確保爲Params或任何子類定義了正確的副本構造函數。