#include <iostream>
typedef bool (*Require)(int x);
typedef int (*Convert)(int x);
class Base {
private:
int _x;
public:
virtual void print() {
std::cout << _x << std::endl;
}
protected:
Base(int x, Require r, Convert c) {
if (r(x))
_x = x;
else
_x = c(x);
}
};
class Derived : public Base {
private:
static bool require(int x) {
return x >= 0;
}
static int convert(int x) {
return -1 * x;
}
public:
Derived(int x) : Base(x, require, convert) {}
};
int main() {
Derived a(1);
Derived b(-1);
a.print();
b.print();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdHlwZWRlZiBib29sICgqUmVxdWlyZSkoaW50IHgpOwp0eXBlZGVmIGludCAgKCpDb252ZXJ0KShpbnQgeCk7CgpjbGFzcyBCYXNlIHsKcHJpdmF0ZToKCWludCBfeDsKcHVibGljOgoJdmlydHVhbCB2b2lkIHByaW50KCkgewoJCXN0ZDo6Y291dCA8PCBfeCA8PCBzdGQ6OmVuZGw7Cgl9CnByb3RlY3RlZDoKCUJhc2UoaW50IHgsIFJlcXVpcmUgciwgQ29udmVydCBjKSB7CgkJaWYgKHIoeCkpCgkJCV94ID0geDsKCQllbHNlCgkJCV94ID0gYyh4KTsKCX0KfTsKCmNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7CnByaXZhdGU6CglzdGF0aWMgYm9vbCByZXF1aXJlKGludCB4KSB7CgkJcmV0dXJuIHggPj0gMDsKCX0KCXN0YXRpYyBpbnQgIGNvbnZlcnQoaW50IHgpIHsKCQlyZXR1cm4gLTEgKiB4OwoJfQpwdWJsaWM6CglEZXJpdmVkKGludCB4KSA6IEJhc2UoeCwgcmVxdWlyZSwgY29udmVydCkge30KfTsKCmludCBtYWluKCkgewoJRGVyaXZlZCBhKDEpOwoJRGVyaXZlZCBiKC0xKTsKCWEucHJpbnQoKTsKCWIucHJpbnQoKTsKCXJldHVybiAwOwp9