Очевидно, вы имеете в виду, что Bar
является потомком Foo
в иерархии классов ...
В этом случае выполнить первую часть можно двумя разными способами
// foo_part_of_bar(bar) = foo;
bar.Foo::operator =(foo);
(Foo &) bar = foo; // or use a C++-style cast
(Последнее может неправильно работать в экзотическом случае, когда соответствующий operator =
объявлен виртуальным и переопределен в Bar
. Но это, как я уже сказал, экзотично.)
Чтобы выполнить вторую часть, вам не нужно прилагать особых усилий
// foo = foo_part_of_bar(bar);
foo = bar;
// This is called slicing
Оба имеют очень ограниченное использование в некоторых очень особых контекстах. Интересно, для чего тебе это нужно ...