Поскольку в каждом классе (неявно) определён оператор присваивания, то происходит сокрытие имён.
struct A
{
A& assign(const A&);
//A& operator=(const A&); // определён компилятором
};
struct B : A
{
B& assign(const B&); // скрывает сигнатуры assign предка
//B& operator=(const B&); // скрывает сигнатуры operator= предка
};
int main()
{
A a;
B b;
b.assign(a); // ошибка: единственная доступная сигнатура принимает const B&
b = a; // та же самая история
}
Выходов два: или определить нужные сигнатуры, или протащить их из предка
struct B : A
{
using A::assign;
using A::operator=;
B& assign(const B&);
};
int main()
{
A a;
B b, c;
b.assign(a); // метод предка
b.assign(c); // родной метод
b = a; // метод предка
b = c; // родной метод
}
A>struct A
A>{
A>......
A>};
A>struct B: public A
A>{
A>};
A>A a1;
A>B b1;
A>// надо сделать b1::A = a1
A>// я делаю так
A>*static_cast<A*>(&b1) = a1;
A>
Здравствуйте, Aractan, Вы писали:
A>Вау, я про то что assign автоматически генерируется вообще не знал,
assign как раз не генерируется автоматически. Я написал его рядом с operator= для контраста, чтобы показать: неважно, рукодельный метод или автоматический, эффект один и тот же.
A>и то, что методы можно протаскивать тоже. Спасибо!
Здравствуйте, Aractan, Вы писали:
A>Угу, точно, я не додумался до этого
Кстати, а как дела обстоят с осмысленностью?
Например,
struct A { int x; };
struct B : A { int y; using A::operator=; };
int main()
{
A a = { 1 };
B b = { 2, 3 };
b = a; // { 1, 3 } - т.е. в b.y остались старые данные, возможно не согласованные с новыми
}