Почему вызывается оператор присваивания базового класса? - PullRequest
2 голосов
/ 02 августа 2020

В следующем коде я понимаю, что оператор присваивания в структуре d не вызывается на derived1 = derived2;, а вместо этого создается и вызывается оператор присваивания по умолчанию. Однако я не понимаю, почему:

Почему не вызывается явный оператор присваивания d для derived1 = derived2;, когда восходящее преобразование неявно в b & base2 = derived1? Я предполагаю, что заключается в том, что значение по умолчанию operator= (с заголовком void operator=(const derived& d)) всегда генерируется, если явно не перегружено одним и тем же заголовком, и всегда будет соответствовать назначению, сделанному из двух переменных того же типа. На правильном ли я пути?

struct b {
   int x;
   void operator=(const b& base) {
      std::cout << "base" << std::endl;
   }
}

struct d: b {
   int y;
   void operator=(const b& base) {
      std::cout << "derived" << std::endl;
   }
}

int main() {
   b base1;
   d derived1;
   d derived2;
   b & base2 = derived1;

   derived1 = base1; // output: "derived"
   derived1 = derived2; // output "base"
}

1 Ответ

2 голосов
/ 02 августа 2020

Ваша догадка в основном верна. Компилятор синтезирует определение

void operator=(const d&)

для производного класса d. (Если только он не синтезирован, потому что он явно delete d, или определенные специальные функции-члены определены пользователем).

Это значение по умолчанию operator= имеет поведение, которое оно будет делать попарную копию аргумента, а также вызвать operator= его базовых классов. В этом случае этот оператор печатает «base», и это то, что вы видите в качестве вывода.

...