【问题标题】:Overloading >> operator for inherited class继承类的重载 >> 运算符
【发布时间】:2015-09-20 00:44:38
【问题描述】:

我将如何进行这项工作?教授指示我们使用私有变量。我是否必须设置新变量才能在 Student 构造函数中输入 Person 的私有成员?完成这项工作的最有效方法是什么?

提前谢谢你。

class Person
{
    friend istream& operator>>(istream&, Person&);
    friend ostream& operator<<(ostream&, Person&);
private:
    char* m_name;
    int m_age;
    string m_ssn;
public:
    Person() = default;
    Person(char*, int, const string&);
    Person(const Person&);
    ~Person();
    void setName(char*);
    char* getName();
    void setAge(int);
    int getAge();
    void setSSN(string);
    string getSSN();
    Person& operator=(const Person&);
};

// ...

class Student : public Person
{
    friend istream& operator>>(istream&, Student&);
    friend ostream& operator<<(ostream&, Student&);
private:
    float m_gpa;
public:
    Student() = default;
    Student(char*, int, const string&, float);
    Student(const Student&);
    void setGPA(float);
    float getGPA();
    Student& operator=(const Student&);
};

istream& operator>>(istream &is, Student &iStudent)
{
    // ?

    return is;
}

【问题讨论】:

    标签: c++ inheritance operator-overloading


    【解决方案1】:
    1. 使用基类实现operator&gt;&gt;operator&lt;&lt;
    2. 使用virtual 成员函数来重定向实现。
    class Person
    {
        friend std::istream& operator>>(std::istream&, Person&);
        friend std::ostream& operator<<(std::ostream&, Person&);
    
        ....
    
       public:
    
        virtual std::istream& read(std::istream&) { ... }
        virtual std::ostream& write(std::ostream&) const { ... }
    
        ...
    };
    
    std::istream& operator>>(std::istream &is, Person& person)
    {
       return persone.read(is);
    }
    
    std::stream& operator<<(std::ostream &os, Person const& person)
    {
       return persone.write(os);
    }
    
    class Student : public Person
    {
       ...
    
       public:
    
        virtual std::istream& read(std::istream&) { ... }
        virtual std::ostream& write(std::ostream&) const { ... }
    
       ...
    };
    

    【讨论】:

      猜你喜欢
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多