#include <iostream>
#include <memory>
class Base
{
public:
virtual ~Base() {};
virtual int getInfo() const = 0;
};
class Derived1 : public Base
{
public:
Derived1(int x) : d1_(x) {}
virtual int getInfo() const final { return d1_; }
private:
int d1_;
};
class Derived2 : public Base
{
public:
Derived2(int x) : d2_(x) {}
virtual int getInfo() const final { return d2_; }
private:
int d2_;
};
int main()
{
std::unique_ptr<Base> d1(new Derived1(1));
std::unique_ptr<Base> d2(new Derived2(2));
std::cout << d1->getInfo() << std::endl << d2->getInfo();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgQmFzZQp7CnB1YmxpYzoKCXZpcnR1YWwgfkJhc2UoKSB7fTsKCgl2aXJ0dWFsIGludCBnZXRJbmZvKCkgY29uc3QgPSAwOwp9OwoKY2xhc3MgRGVyaXZlZDEgOiBwdWJsaWMgQmFzZQp7CnB1YmxpYzoKCURlcml2ZWQxKGludCB4KSA6IGQxXyh4KSB7fQoJdmlydHVhbCBpbnQgZ2V0SW5mbygpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIGQxXzsgfQoKcHJpdmF0ZToKCWludCBkMV87Cn07CgpjbGFzcyBEZXJpdmVkMiA6IHB1YmxpYyBCYXNlCnsKcHVibGljOgoJRGVyaXZlZDIoaW50IHgpIDogZDJfKHgpIHt9Cgl2aXJ0dWFsIGludCBnZXRJbmZvKCkgY29uc3QgZmluYWwgeyByZXR1cm4gZDJfOyB9Cgpwcml2YXRlOgoJaW50IGQyXzsKfTsKCmludCBtYWluKCkKewoJc3RkOjp1bmlxdWVfcHRyPEJhc2U+IGQxKG5ldyBEZXJpdmVkMSgxKSk7CglzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4gZDIobmV3IERlcml2ZWQyKDIpKTsKCglzdGQ6OmNvdXQgPDwgZDEtPmdldEluZm8oKSA8PCBzdGQ6OmVuZGwgPDwgZDItPmdldEluZm8oKTsKCglyZXR1cm4gMDsKfQ==