class SomeBigData
{
public:
SomeBigData() = delete;
explicit SomeBigData(int) {}
private:
char buffer[1024];
};
class Interface
{
public:
Interface(int value, SomeBigData& data) : value(value), data(data) {}
~Interface() {}
virtual void function1() = 0;
virtual void function2() = 0;
protected:
Interface(); // No implementation
protected:
int value;
SomeBigData& data;
};
class ImpOne : public virtual Interface
{
public:
void function1() override { ++value; }
};
class ImpTwo : public virtual Interface
{
public:
void function2() override { --value; }
};
class Device : public ImpOne, public ImpTwo
{
public:
Device(SomeBigData& data) : Interface(42, data) {}
};
int main()
{
SomeBigData data(42);
Device d(data);
d.function1();
d.function2();
return 0;
}
Y2xhc3MgU29tZUJpZ0RhdGEKewpwdWJsaWM6CiAgICBTb21lQmlnRGF0YSgpID0gZGVsZXRlOwogICAgZXhwbGljaXQgU29tZUJpZ0RhdGEoaW50KSB7fQpwcml2YXRlOgogICAgY2hhciBidWZmZXJbMTAyNF07Cn07CgpjbGFzcyBJbnRlcmZhY2UKewpwdWJsaWM6CiAgICBJbnRlcmZhY2UoaW50IHZhbHVlLCBTb21lQmlnRGF0YSYgZGF0YSkgOiB2YWx1ZSh2YWx1ZSksIGRhdGEoZGF0YSkge30KICAgIH5JbnRlcmZhY2UoKSB7fQoKICAgIHZpcnR1YWwgdm9pZCBmdW5jdGlvbjEoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgZnVuY3Rpb24yKCkgPSAwOwpwcm90ZWN0ZWQ6CiAgICBJbnRlcmZhY2UoKTsgLy8gTm8gaW1wbGVtZW50YXRpb24KcHJvdGVjdGVkOgogICAgaW50IHZhbHVlOwogICAgU29tZUJpZ0RhdGEmIGRhdGE7Cn07CgpjbGFzcyBJbXBPbmUgOiBwdWJsaWMgdmlydHVhbCBJbnRlcmZhY2UKewpwdWJsaWM6CiAgICB2b2lkIGZ1bmN0aW9uMSgpIG92ZXJyaWRlIHsgKyt2YWx1ZTsgfQp9OwoKY2xhc3MgSW1wVHdvIDogcHVibGljIHZpcnR1YWwgSW50ZXJmYWNlCnsKcHVibGljOgogICAgdm9pZCBmdW5jdGlvbjIoKSBvdmVycmlkZSB7IC0tdmFsdWU7IH0KfTsKCmNsYXNzIERldmljZSA6IHB1YmxpYyBJbXBPbmUsIHB1YmxpYyBJbXBUd28KewpwdWJsaWM6CiAgICBEZXZpY2UoU29tZUJpZ0RhdGEmIGRhdGEpIDogSW50ZXJmYWNlKDQyLCBkYXRhKSB7fQp9OwoKaW50IG1haW4oKQp7CiAgICBTb21lQmlnRGF0YSBkYXRhKDQyKTsKICAgIERldmljZSBkKGRhdGEpOwogICAgZC5mdW5jdGlvbjEoKTsKICAgIGQuZnVuY3Rpb24yKCk7CiAgICByZXR1cm4gMDsKfQo=