2013-11-02 3 views
3

как вызвать оператор * из производного класса nVect его базового класса Vect?Как вызвать оператор из базового класса в производном классе?

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».

Что случилось?

Спасибо всем! Jonas

ответ

4

Это бесплатная функция, которая объявлена ​​friend из Vect, а не функция члена Vect (даже если он выглядит как функция члена, как он определен в классе, но это здесь не имеет значения, см. FAQ для получения дополнительной информации). Вам нужно

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

Это говорит, что это странно взять неконстантную ссылку на operator* как вызывающий абонент будет обычно весьма удивлён, если изменить аргумент. Кроме того, нет никаких оснований для возвращения константного значения, поэтому я предлагаю вам изменить подпись:

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

(а также для Vect::operator*)

+0

Спасибо! Вы абсолютно безупречны! Я буду отмечать ваш ответ как решение как можно скорее. – Jonas

Смежные вопросы