#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
using namespace std;
class A {
int val;
public:
A(int x=0) : val(x){}
A& operator= ( const A &rhs ) { return *this; }
void show() { cout<<val<<" ";}
int get() const { return val; }
};
class B: public A {
public:
B(int x=0) : A(x) {}
B( const B& rhs) : A(static_cast<A>(rhs)) {}
B(const A& rhs) : A(rhs) {} // <================= WITHOUT THIS CTOR, IT FAILS TO COMPILE
B& operator= ( const A &rhs ) { return *this; }
};
int main() {
A a;
B b;
std::list < A > aa{ A(1), A(2), A(3)};
std::list < B > bb;
a = b; // works
b = a; // works
//std::copy(aa.begin(), aa.end(), bb.begin()); // ouch: to avoid
//for (auto &x : bb) x.show(); // ouch !! only copies on existing elements
std::copy(aa.begin(), aa.end(), back_inserter<list<B>>(bb));
for (auto &x : bb) x.show(); cout<<endl;
bb.assign(aa.begin(), aa.end());
for (auto &x : bb) x.show(); cout<<endl;
std::copy(bb.begin(), bb.end(), back_inserter<list<A>>(aa));
std::copy(bb.begin(), bb.end(), aa.begin());
std::list <int> xx;
std::transform (aa.begin(), aa.end(), std::back_inserter<list<int>>(xx), [](const A&a){return a.get();});
std::copy(xx.begin(), xx.end(), std::ostream_iterator<int>(cout,";")); cout<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCmNsYXNzIEEgewoJICAgIGludCB2YWw7IAogICAgcHVibGljOgogICAgICAgIEEoaW50IHg9MCkgOiB2YWwoeCl7fQogICAgICAgIEEmIG9wZXJhdG9yPSAoIGNvbnN0IEEgJnJocyApIHsgcmV0dXJuICp0aGlzOyB9CiAgICAgICAgdm9pZCBzaG93KCkgeyBjb3V0PDx2YWw8PCIgIjt9CiAgICAgICAgaW50IGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbDsgfQp9OwpjbGFzcyBCOiBwdWJsaWMgQSB7CiAgICBwdWJsaWM6CiAgICAgICAgQihpbnQgeD0wKSA6IEEoeCkge30KICAgICAgICBCKCBjb25zdCBCJiByaHMpIDogQShzdGF0aWNfY2FzdDxBPihyaHMpKSB7fQogICAgICAgIEIoY29uc3QgQSYgcmhzKSA6IEEocmhzKSB7fSAgLy8gPD09PT09PT09PT09PT09PT09IFdJVEhPVVQgVEhJUyBDVE9SLCBJVCBGQUlMUyBUTyBDT01QSUxFIAogICAgICAgIEImIG9wZXJhdG9yPSAoIGNvbnN0IEEgJnJocyApIHsgcmV0dXJuICp0aGlzOyB9Cn07CgppbnQgbWFpbigpIHsKICAgIEEgYTsKICAgIEIgYjsKICAgIHN0ZDo6bGlzdCA8IEEgPiBhYXsgQSgxKSwgQSgyKSwgQSgzKX07CiAgICBzdGQ6Omxpc3QgPCBCID4gYmI7CiAgICBhID0gYjsgLy8gd29ya3MKICAgIGIgPSBhOyAvLyB3b3JrcwogICAgLy9zdGQ6OmNvcHkoYWEuYmVnaW4oKSwgYWEuZW5kKCksIGJiLmJlZ2luKCkpOyAgLy8gb3VjaDogdG8gYXZvaWQKICAgIC8vZm9yIChhdXRvICZ4IDogYmIpIHguc2hvdygpOyAgLy8gb3VjaCAhISBvbmx5IGNvcGllcyBvbiBleGlzdGluZyBlbGVtZW50cyAKICAgIHN0ZDo6Y29weShhYS5iZWdpbigpLCBhYS5lbmQoKSwgYmFja19pbnNlcnRlcjxsaXN0PEI+PihiYikpOyAKICAgIGZvciAoYXV0byAmeCA6IGJiKSB4LnNob3coKTsgY291dDw8ZW5kbDsgCiAgICBiYi5hc3NpZ24oYWEuYmVnaW4oKSwgYWEuZW5kKCkpOwogICAgZm9yIChhdXRvICZ4IDogYmIpIHguc2hvdygpOyBjb3V0PDxlbmRsOyAKICAgIHN0ZDo6Y29weShiYi5iZWdpbigpLCBiYi5lbmQoKSwgYmFja19pbnNlcnRlcjxsaXN0PEE+PihhYSkpOyAKICAgIHN0ZDo6Y29weShiYi5iZWdpbigpLCBiYi5lbmQoKSwgYWEuYmVnaW4oKSk7IAogICAKICAgIHN0ZDo6bGlzdCA8aW50PiB4eDsgCiAgICBzdGQ6OnRyYW5zZm9ybSAoYWEuYmVnaW4oKSwgYWEuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcjxsaXN0PGludD4+KHh4KSwgW10oY29uc3QgQSZhKXtyZXR1cm4gYS5nZXQoKTt9KTsgICAgIAogICAgc3RkOjpjb3B5KHh4LmJlZ2luKCksIHh4LmVuZCgpLCBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8aW50Pihjb3V0LCI7IikpOyBjb3V0PDxlbmRsOyAKCXJldHVybiAwOwp9