使用基础构造函数创建派生对象

时间:2016-03-13 14:42:44

标签: c++ arrays csv

我正在从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,其中包含基础Material类的属性,该类使用构造函数来设置变量。如何从派生对象访问和更改它们?

1 个答案:

答案 0 :(得分: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的构造函数做同样的事情,把参数传递给基类。

要关闭循环,如果按值传递所有这些参数,每个构造函数都会生成一个单独的向量副本。非常低效。通过使用常量引用,不会创建副本。