Скопировать оператор присваивания для алмазного наследования C

#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. Это показывает, почему вы никогда не должны выполнять алмазное наследование. На практике это всегда плохая идея.