2015-01-21 6 views
0

У меня есть проблема с перегрузкой и наследованием операторов на C++.Перегрузка и наследование оператора (сохранение того же типа)

Быстрый эскиз:

class A { 
public: 
    A operator+ (const A &b) const { ... } 
}; 

class B : public A { 
    ... 
}; 

Теперь предположим, что у меня есть два экземпляра B, x и y. Если я их добавлю, я получу вещь типа A, однако я хочу, чтобы она была типа B.

Каков наилучший способ выполнения этого (кроме переопределения их в классе B)? CRTP?

+1

Вы можете использовать конструктор в B, преобразующий A в B 'B (const A &)'. Однако, если B содержит дополнительную информацию, перезапишите оператора. –

+1

Вы должны переопределить его в B, но вы можете вызвать реализацию базового класса путем возврата A :: operator + (b); – cppguy

+1

Возможный дубликат [Перегрузка оператора C++ с наследованием] (http://stackoverflow.com/questions/17122111/c-operator-overloading-with-inheritance) – Pradhan

ответ

1

Вы можете реализовать operator+ вне класса в качестве шаблона:

template<class type> type operator+(const type& left, const type& right) 
{ 
    type toReturn; 
    toReturn.value = left.value + right.value; 
    return toReturn; 
} 

class A { 
private: 
    int value; 

    template <class type> 
    friend type operator+<type>(const type& left, const type& right); 
}; 

class B : public A { 
}; 

int main() 
{ 
    B test1, test2; 

    B test3 = test1 + test2; 
} 

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

+1

Могу я предложить некоторые изменения? * значение не должно быть обновлено в классе B, поскольку оно наследуется от A, * делает значение частным и объявляет глобального оператора + друга A –

+0

Упс, спасибо! Я внедрил ваши предложения. –

+0

В итоге я использовал CRTP, так как не хотел загрязнять свое пространство имен. Тем не менее, спасибо - я собираюсь принять этот ответ –

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