#include <iostream>
using namespace std;
class IWithOperations {
public:
// implemented in COperations
virtual void AddOperation() = 0;
};
class IDocInterface : public virtual IWithOperations
{
public:
// implemented in CSpecificDoc
virtual bool CreateDoc() = 0;
// implemented in CDoc
virtual void Save() = 0;
};
class COperations : public virtual IWithOperations
{
public:
void AddOperation() {}; // implementation for CDoc and derivates
};
class CDoc : public virtual IDocInterface, public virtual COperations
{
public:
void Save() {} // implemented here
virtual bool CreateDoc() = 0; // must be overridden
};
class CSpecificDoc : public virtual CDoc
{
public:
bool CreateDoc() {} // implemented here
};
int main() {
CSpecificDoc specific;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIElXaXRoT3BlcmF0aW9ucyB7CnB1YmxpYzoKICAgICAgLy8gaW1wbGVtZW50ZWQgaW4gQ09wZXJhdGlvbnMKICAgICAgdmlydHVhbCB2b2lkIEFkZE9wZXJhdGlvbigpID0gMDsKfTsKCmNsYXNzIElEb2NJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBJV2l0aE9wZXJhdGlvbnMKewogcHVibGljOgogICAgICAvLyBpbXBsZW1lbnRlZCBpbiBDU3BlY2lmaWNEb2MKICAgICAgdmlydHVhbCBib29sIENyZWF0ZURvYygpID0gMDsKCiAgICAgIC8vIGltcGxlbWVudGVkIGluIENEb2MKICAgICAgdmlydHVhbCB2b2lkIFNhdmUoKSA9IDA7Cn07CgpjbGFzcyBDT3BlcmF0aW9ucyA6IHB1YmxpYyB2aXJ0dWFsIElXaXRoT3BlcmF0aW9ucwp7CiBwdWJsaWM6CiAgICAgIHZvaWQgQWRkT3BlcmF0aW9uKCkge307IC8vIGltcGxlbWVudGF0aW9uIGZvciBDRG9jIGFuZCBkZXJpdmF0ZXMKfTsKCmNsYXNzIENEb2MgOiBwdWJsaWMgdmlydHVhbCBJRG9jSW50ZXJmYWNlLCBwdWJsaWMgdmlydHVhbCBDT3BlcmF0aW9ucwp7CiAgICBwdWJsaWM6CiAgICAgICAgIHZvaWQgU2F2ZSgpIHt9IC8vIGltcGxlbWVudGVkIGhlcmUKICAgICAgICAgdmlydHVhbCBib29sIENyZWF0ZURvYygpID0gMDsgLy8gbXVzdCBiZSBvdmVycmlkZGVuCn07CgpjbGFzcyBDU3BlY2lmaWNEb2MgOiBwdWJsaWMgdmlydHVhbCBDRG9jCnsKcHVibGljOgogICAgICBib29sIENyZWF0ZURvYygpIHt9IC8vIGltcGxlbWVudGVkIGhlcmUKfTsKCmludCBtYWluKCkgewoJQ1NwZWNpZmljRG9jIHNwZWNpZmljOwoJcmV0dXJuIDA7Cn0=