#include <iostream>
#include <memory>
using namespace std;
class CMother
{
private:
void _CommonStuff()
{
cout << "work common to children" << endl;
}
virtual bool _Compute() = 0;
public:
bool Compute()
{
_CommonStuff();
_Compute();
}
};
class C1 : public CMother
{
private:
virtual bool _Compute() override
{
cout << "work specific to C1" << endl;
return true;
}
};
class C2 : public CMother
{
private:
virtual bool _Compute() override
{
cout << "work specific to C2" << endl;
return true;
}
};
int main() {
unique_ptr<CMother> c1(new C1);
unique_ptr<CMother> c2(new C2);
c1->Compute();
c2->Compute();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQ01vdGhlcgp7CnByaXZhdGU6Cgl2b2lkIF9Db21tb25TdHVmZigpCgl7CgkJY291dCA8PCAid29yayBjb21tb24gdG8gY2hpbGRyZW4iIDw8IGVuZGw7Cgl9CgkKCXZpcnR1YWwgYm9vbCBfQ29tcHV0ZSgpID0gMDsKcHVibGljOgoJYm9vbCBDb21wdXRlKCkKCXsKCQlfQ29tbW9uU3R1ZmYoKTsKCQlfQ29tcHV0ZSgpOwoJfQp9OwoKY2xhc3MgQzEgOiBwdWJsaWMgQ01vdGhlcgp7CnByaXZhdGU6Cgl2aXJ0dWFsIGJvb2wgX0NvbXB1dGUoKSBvdmVycmlkZQoJewoJCWNvdXQgPDwgIndvcmsgc3BlY2lmaWMgdG8gQzEiIDw8IGVuZGw7CgkJCgkJcmV0dXJuIHRydWU7Cgl9Cn07CgpjbGFzcyBDMiA6IHB1YmxpYyBDTW90aGVyCnsKcHJpdmF0ZToKCXZpcnR1YWwgYm9vbCBfQ29tcHV0ZSgpIG92ZXJyaWRlCgl7CgkJY291dCA8PCAid29yayBzcGVjaWZpYyB0byBDMiIgPDwgZW5kbDsKCQkKCQlyZXR1cm4gdHJ1ZTsKCX0KfTsKCmludCBtYWluKCkgewoJCgl1bmlxdWVfcHRyPENNb3RoZXI+IGMxKG5ldyBDMSk7Cgl1bmlxdWVfcHRyPENNb3RoZXI+IGMyKG5ldyBDMik7CgkKCWMxLT5Db21wdXRlKCk7CgljMi0+Q29tcHV0ZSgpOwoJCglyZXR1cm4gMDsKfQ==