Присвоение объекта базового класса объекту производного класса

55
6

Почему я получаю error: no match for 'operator= in 'y = x в следующем коде?
Невозможно ли a-компонент b не просто присваивать, как это был a-object = a-object?

struct a {int i;};
struct b : public a {int j;};

int main()
{
a x;
b y;

x.i = 9;
y.j = 5;

y = x; // error: no match for ‘operator= in ‘y = x

// expected: y.i = 9

return 0;
}

спросил(а) 2013-05-10T10:50:00+04:00 6 лет, 7 месяцев назад
3
Решение
46

Вы явно не определяете какие-либо операторы присваивания, поэтому компилятор будет генерировать свои собственные операторы по умолчанию для каждой структуры. Оператор присваивания по умолчанию для компилятора в b принимает входной сигнал b и назначает оба члена. Операторы присваивания не наследуются автоматически при использовании наследования. Вот почему вы не можете передать a, к b - нет оператора присваивания в b, который принимает a, в качестве входных данных. Если вы хотите это разрешить, вам нужно сообщить компилятору, например:

struct a
{
int i;

a& operator=(const a &rhs)
{
i = rhs.i;
return *this;
}
};

struct b : public a
{
int j;

using a::operator=;

b& operator=(const b &rhs)
{
*this = static_cast<const a&>(rhs);
j = rhs.j;
return *this;
}
};

int main()
{
a x;
b y;
b z;
...
y = x; // OK now
y = z; // OK as well
...
return 0;
}

ответил(а) 2013-05-10T11:11:00+04:00 6 лет, 7 месяцев назад
Еще 2 ответа
32

По мере возникновения ошибки вам необходимо реализовать оператор присваивания. То есть, функция, которая сообщает вашей программе, как назначить один объект другому. Вы можете найти много информации об этом при поиске в Интернете, например, на http://www.cplusplus.com/articles/y8hv0pDG/

ответил(а) 2013-05-10T10:53:00+04:00 6 лет, 7 месяцев назад
33

Нет, потому что, даже если классы связаны между собой, они разные.


Подумайте об этом, даже если бы это было разрешено, и оно будет работать так, как вы ожидали, каково будет значение yj после назначения?

ответил(а) 2013-05-10T10:52:00+04:00 6 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема