2013-11-02 89 views
3

如何從基類Vect的派生類nVect調用操作符*如何從派生類中的基類調用運算符?

class Vect 
{ 

protected: 
    int v1_; 
    int v2_; 
    int v3_; 

public: 
    Vect(int v1, int v2, int v3); 
    Vect(const Vect &v); 
    ~Vect(); 
    friend const Vect operator*(Vect& v, int n); 
    friend const Vect operator*(int n, Vect& v); 
}; 


class nVect : public Vect 
{ 
//private 
    int pos_; 
    int value_; 

    void update(); 

public: 
    nVect(int v1, int v2, int v3, int pos, int value); 
    nVect(const Vect & v, int pos, int value); 
    ~nVect(); 

    friend const nVect operator*(nVect& v, int n); 
    friend const nVect operator*(int n, nVect& v); 
}; 

現在,編譯器會抱怨在下面的代碼行:

const nVect operator*(nVect& v, int n) 
{ 
    return nVect(Vect::operator*(v, n), v.pos_, v.value_); 
} 

錯誤:「運算符*」不是「的Vect」的成員。

怎麼了?

謝謝大家! 喬納斯

回答

4

這是該聲明的Vectfriend免費的功能,而不是Vect一個成員函數(即使它看起來像一個成員函數,因爲它是在類中定義的,但不要緊這裏,有關更多信息,請參閱FAQ)。您需要

const nVect operator*(nVect& v, int n) 
{ 
    return nVect(static_cast<Vect&>(v)*n, v.pos_, v.value_); 
} 

這就是說,它的怪異采取非const引用的operator*作爲主叫通常會被相當,如果你修改了參數驚訝。此外,沒有任何理由返回一個常量的值,所以我建議你改簽名:

nVect operator*(const nVect& v, int n) 
{ 
    return nVect(static_cast<const Vect&>(v)*n, v.pos_, v.value_); 
} 

(且同樣Vect::operator*

+0

謝謝!你絕對適中!我會盡快將答案標記爲解決方案。 – Jonas