C++ - 填充派生 class 数据成员,同时设置基础 class 属性值

C++ - populate derived class data members, also setting base class attribute values

我正在开发一个程序,该程序从现有文件中读取一些数据,将输入存储到 istream 中,然后将此数据过滤到 class 的数据成员中调用 readDataFromFile()方法。我有一个用于基础 class 的工作,我想将其扩展到派生的 class 并使用方法的覆盖来为派生的 class 工作。我只是在努力从派生 class 访问基 class 的数据成员,因为基 class 不包含 set 方法。

示例:

//has attributes x, y
class Base {
    //declaration
    virtual void readDataFromStream(istream&);

    //definition
    //function called from inside function that passes file data into stream
    //- stream already contains data
    void Base::readDataFromStream(istream& is) {
        //insert values from stream into attributes
        is >> x;
        is >> y;
    }
}

//inherits x, y
//has new attribute z
class Derived : Base {
    //declaration
    //method inherited from Base
    virtual void readDataFromStream(istream&);

    //definition - overrides definition in Base
    //function called from inside function that passes file data into stream
    //- stream already contains data
    void Derived::readDataFromStream(istream& is) {
        //insert values from stream into attributes
        is >> x; <-- cannot access x to change value
        is >> y; <-- cannot access y to change value
        is >> z;
    }
}

目前我正试图找到解决此问题的方法,但看不到它可以工作的方法,除非有某种方法可以将它们从流中读入单独的局部变量并拥有对象通过它自己的自定义构造函数重新构造自己,尽管我以前从未见过。

任何关于从这里去哪里的建议都很好,谢谢。

您无法从派生 class 访问基 class 的私有成员。为此,您需要使这些成员受保护而不是私有:

class Base {
    //no visibility defined means private, not visible for derived
    int oops;  
protected:   // this is visible for derived, but not for outsiders
    int x, y; 
public:      // this is visible for everyone
    virtual void readDataFromStream(istream&);
};  

另请注意,class 继承中基 class 的默认可见性是私有的。这意味着派生 class 的用户原则上无法访问基础 class 的 public 成员(这里不是问题)。您宁愿继承 public 除非您有充分的理由不这样做。

class Derived :  public Base {  // no visibility would mean private inheritance 
protected:
    int z; 
public: 
    void readDataFromStream(istream&) override;
};

最后,多态性不应阻止您最大限度地提高封装性和可维护性:

void Derived::readDataFromStream(istream& is) {
    Base::readDataFromStream(is);  // do base version 
    is >> z;                       // then do more specific things
}

Online demo