#include <iostream>
#include <memory>
using namespace std;
class B {
public:
virtual void Bar() { cout << "B::Bar()"<<endl; }
virtual ~B() { cout << "B destroyed"<<endl; }
};
class BB:public B{
public:
void Bar() override { cout << "BB::Bar()"<<endl; }
~BB() { cout << "BB destroyed"<<endl; }
};
class A
{
private:
unique_ptr<B> _b;
public:
template<class T>A(const T&b): _b(make_unique<T>(b)) { }
void Foo()
{
_b->Bar();
}
};
int main() {
{
B b;
A a{b};
a.Foo();
}
{
BB bb;
A aa{bb};
aa.Foo();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQiB7CnB1YmxpYzogCgl2aXJ0dWFsIHZvaWQgQmFyKCkgeyBjb3V0IDw8ICJCOjpCYXIoKSI8PGVuZGw7IH0KCXZpcnR1YWwgfkIoKSB7IGNvdXQgPDwgIkIgZGVzdHJveWVkIjw8ZW5kbDsgfQp9OyAKY2xhc3MgQkI6cHVibGljIEJ7CnB1YmxpYzogCgl2b2lkIEJhcigpIG92ZXJyaWRlIHsgY291dCA8PCAiQkI6OkJhcigpIjw8ZW5kbDsgfQoJfkJCKCkgeyBjb3V0IDw8ICJCQiBkZXN0cm95ZWQiPDxlbmRsOyB9Cn07CgpjbGFzcyBBCnsKICBwcml2YXRlOgogICAgdW5pcXVlX3B0cjxCPiBfYjsKICBwdWJsaWM6CiAgICB0ZW1wbGF0ZTxjbGFzcyBUPkEoY29uc3QgVCZiKTogX2IobWFrZV91bmlxdWU8VD4oYikpIHsgfQoKICAgIHZvaWQgRm9vKCkKICAgIHsKICAgICAgICBfYi0+QmFyKCk7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKCXsKCQlCIGI7IAoJCUEgYXtifTsgCgkJYS5Gb28oKTsKCX0KCXsKCQlCQiBiYjsKCQlBIGFhe2JifTsKCQlhYS5Gb28oKTsgCgl9CglyZXR1cm4gMDsKfQ==