2014-09-25 60 views
-1

繼承的成員變量假設我們有一個類,它封裝了一個載體,就像這樣:專門初始化

class VectorContainer 
{ 
    public: 
     VectorContainer() 
      : mVector() 
    protected: 
     std::vector<int> mVector; 
}; 

假設我們有到位使得唯一明智的構造上面的一個給定的繼承結構 - 沒有更多可能會被添加。

假設我們需要一個專門的子類VectorContainer其中mVector代表具有預定的恆定行/列數的網格。我們是否可以製作類似於
DerivedContainer(size_t numRows, size_t numColumns)的構造函數,同時將mVector初始化爲適當的大小?

回答

2

在不更改構造函數VectorContainer的情況下,您無法實現您的目標。這是因爲這個基礎構造函數將始終由構造函數DerivedContainer調用,因爲這是存在的唯一構造函數。這是明智的封裝行爲 - mVectorVectorContainer的成員,並且它是VectorContainer的責任,正確構建它。構造函數可以隨時根據需要調整其大小。

+0

換句話說:具有描述行爲的最有效的「C++ ish」方式是讓'VectorContainer'構造'mVector',然後在DerivedContainer構造函數中調用'mVector.resize(...)' ? – Conduit 2014-09-25 05:55:49

+0

@Conduit是的,沒錯。 – Pradhan 2014-09-25 06:15:14

1

您的成員變量mVector是私有的,因此VectorContainer以外的任何內容都無法訪問它。由於無法擴展VectorContainer類,因此無用。


對於受保護的,你可以創建派生類的構造函數:

class DerivedContainer : VectorContainer 
{ 
    public: 
     DerivedContainer(size_t numRows, size_t numColumns) : VectorContainer() 
     { 
      mVector.assign(numRows); 
     } 
}; 

我不知道爲什麼你傳遞兩個變量來構造的,但標準::向量是一個維數組。

+0

更多的讀取清晰度比其他任何事情 - 當代表一個3x3網格時,儘管我們知道它有9個元素,但構造一個看起來像3x3網格的實例是有意義的。 – Conduit 2014-09-25 06:00:19