运算符重载继承的类

时间:2013-04-02 20:42:03

标签: c++ inheritance stream operator-overloading

这是2个班级

class B
{
private:
    int x;
public:
    friend std::istream& operator>>(std::istream& in, B& obj)
    {
        in >> obj.x;
        return in;
    }
};

class D: public B
{
private:
    int y;
public:
    friend std::istream& operator>>(std::istream& in, D& obj)
    {
        //?
    }
};

有没有办法可以重载D类中的>>运算符,以便它能够访问B中的元素x?

3 个答案:

答案 0 :(得分:1)

  

有什么方法可以覆盖>> D类中的运算符,以便他能够访问B中的元素x?

不要将x设为私有。

通过将其设为私有,您明确表示对class B及其朋友的访问权限仅限于protected。从你的问题来看,似乎你不希望这样。

如果是obj.x,则可以{{1}}访问它。

答案 1 :(得分:1)

根据您的目的,您也可以这样做:

class B
{
private:
    int x;
public:
    friend std::istream& operator>>(std::istream& in, B& obj)
    {
        in >> obj.x;
        return in;
    }
};

class D: public B
{
private:
    int y;
public:
    friend std::istream& operator>>(std::istream& in, D& obj)
    {
        B* cast = static_cast<B*>(&D); //create pointer to base class
        in >> *B; //this calls the operator>> function of the base class
    }
};

尽管可能还有其他理由让x受到保护而不是私有。

答案 2 :(得分:0)

x需要受到保护。否则无法直接从D.

访问
class B
{
protected:
    int x;

然后你可以做

class D: public B
{
private:
    int y;
public:
    friend std::istream& operator>>(std::istream& in, D& obj)
    {
        in >> obj.x;
        return in;
    }
};