2016-03-13 61 views
1

我正在從CSV文件讀取一行到一個向量中,然後我想將此向量傳遞到正確的派生類中,因此請使用正確的私有屬性創建一個對象。但是,如何將向量傳遞給基類,而不僅僅是傳遞給派生的對象?使用基礎構造函數創建派生對象

基類:

class Material 
{ 
public: 
    Material() ; 
    virtual ~Material() ; 

    void addNewMaterial(); 

private: 

    std::string type; 
    std::string format; 
    int idNumber; 
    std::string filmTitle; 
    std::string audioFormat; 
    float runtime; 
    std::string language; 
    float retailPrice; 
    std::string subtitles; 
    std::string frameAspect; 
    std::string bonusFeatures; 
}; 

派生類:

class Disk : public Material 
{ 
public: 
    Disk(); 
    ~Disk(); 

private: 

    std::string packaging; 

    std::string audioFormat; 
    std::string language;  //multiple language tracks 
    std::string subtitles; //subtitles in different languages 
    std::string bonusFeatures; //bonus features 

}; 

第二派生類

class ssDVD : public Disk 
{ 
public: 
    ssDVD(std::vector<std::string>); 
    ~ssDVD(); 

private: 

    //plastic box 

}; 

我想創建一個新的ssDVD與基材類的特性,這使用構造函數來設置變量。如何從派生對象訪問和更改這些對象?

回答

1

您的派生類的構造函數將需要將其參數傳遞給它的父類的構造函數。

首先,在大多數情況下,它更有效地傳遞非POD功能參數,經常提到,爲了避免值拷貝大對象:

class ssDVD : public Disk { 
public: 
    ssDVD(const std::vector<std::string> &); 

    // ... 
}; 

然後,構造函數通過其參數父類的構造函數,按值:

ssDVD::ssDVD(const std::vector<std::string> &v) : Disk(v) 
    // Whatever else the constructor needs to do 
{ 
    // Ditto... 
} 

當然,你必須有Disk的構造做的一樣,將參數傳遞給基類。

並且要關閉循環,如果您按值傳遞了所有這些參數,則每個構造函數都會創建一個單獨的向量副本。非常低效。通過使用常量引用,不會創建副本。

相關問題