2013-04-02 73 views
1
這裏

是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類重載>>運營商因此將能夠訪問的元素x B中的任何方式?

+0

更具體,讓'x'保護;) – maditya

回答

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保護的,而不是私人反正。

1

有沒有什麼辦法可以覆蓋D類中的>>操作符,以便他能夠訪問B中的元素x?

請勿使x私密。

通過使私人,你明確地說,訪問它僅限於class B和它的朋友。而從你的問題來看,你似乎不想要那樣。

如果是protected相反,你可以訪問它爲obj.x

+0

這恐怕是行不通的,因爲'運營商>>'這裏是'D',而不是一個成員函數 –

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; 
    } 
}; 
+0

'x'由'D'在某種意義上說,'D'有'x'數據成員繼承的朋友。它只是無法訪問。 – juanchopanza

+0

固定。 .... .. – 2013-04-02 21:13:24