#include <iostream>
#include <memory>
class Abstract {
public:
virtual const char* name() const { return "Abstract"; }
std::unique_ptr<Abstract> clone() const { return std::unique_ptr<Abstract>{ vclone() }; }
protected:
virtual Abstract* vclone() const = 0;
};
class Implementation : public Abstract {
public:
const char* name() const override { return "Implementation"; }
std::unique_ptr<Implementation> clone() const { return std::unique_ptr<Implementation>{ vclone() }; }
protected:
virtual Implementation* vclone() const override { return new Implementation(*this); }
};
int main()
{
Implementation impl;
Abstract* a = &impl;
std::unique_ptr<Abstract> b = a->clone();
std::cout << b->name() << std::endl;
std::unique_ptr<Implementation> c = impl.clone();
return 0;
}
scanf_s("%s", f, 80);