2016-03-13 3 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 «s конструктор сделать то же самое, чтобы передать параметр в базовом классе.

И, чтобы закрыть цикл, если вы передавали все эти параметры по значению, каждый конструктор будет создавать отдельную копию вектора. Очень неэффективно. Используя постоянные ссылки, копии не создаются.

Смежные вопросы