#c #oop #inheritance #operator-overloading #assignment-operator
#c #ооп #наследование #оператор-перегрузка #оператор присваивания
Вопрос:
У меня есть 4 класса в иерархии алмазного наследования. Правильно ли вызывать оператор присваивания обоих родителей для оператора присваивания в der12
классе? Разве это не вызовет base
operator= 2 раза? Есть ли лучший способ сделать это?
protected:
int a = 1;
public:
baseamp; operator=(const baseamp; ref){
...
}
};
class der1 : virtual public base{
protected:
int b = 2;
public:
der1amp; operator=(const der1amp; ref){
...
}
};
class der2 : virtual public base{
protected:
int c = 3;
public:
der2amp; operator=(const der2amp; ref){
...
}
};
class der12 : public der1, public der2{
int d = 4;
public:
der12amp; operator=(const der12amp; ref){
der1::operator=(ref);
der2::operator=(ref);
d = ref.d;
return *this;
}
};```
Комментарии:
1. Ваш оператор присваивания for
der12
не вызывает конструктор копирования дляder1
or илиder2
.2. @Peter он вызывает оператор присваивания из
der1
, иder2
я отредактировал свой пост сейчас, спасибо!3. Вы можете разделить логику присваивания для каждого класса и поместить ее в защищенную функцию-член. Затем вызовите те, которые вам нужны, из оператора присваивания в каждом классе.
4. Это показывает, почему вы никогда не должны выполнять алмазное наследование. На практике это всегда плохая идея.