#include <iostream>
using namespace std;
enum class ClassIds : int {
DerivedID
};
struct Interface {
virtual void foo() = 0;
virtual int bar() = 0;
};
template<class T>
class Base : public Interface {
public:
int getType() const { return getTypeId(); }
static int getTypeId() { return T::ClassId; }
};
class Derived : public Base<Derived> {
public:
static const int ClassId = (int)ClassIds::DerivedID;
virtual void foo() { }
virtual int bar() { return 1; }
};
int main() {
Derived der;
Interface* iface = &der;
iface->foo();
iface->bar();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKICAgIGVudW0gY2xhc3MgQ2xhc3NJZHMgOiBpbnQgewogICAgCURlcml2ZWRJRAogICAgfTsKICAgIApzdHJ1Y3QgSW50ZXJmYWNlIHsKICAgIHZpcnR1YWwgdm9pZCBmb28oKSA9IDA7CiAgICB2aXJ0dWFsIGludCBiYXIoKSA9IDA7Cn07CiAgICAKCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgY2xhc3MgQmFzZSA6IHB1YmxpYyBJbnRlcmZhY2UgewogICAgcHVibGljOgogICAgICAgIGludCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlkKCk7IH0KICAgICAgICBzdGF0aWMgaW50IGdldFR5cGVJZCgpIHsgcmV0dXJuIFQ6OkNsYXNzSWQ7IH0KICAgIH07CgogICAgY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlPERlcml2ZWQ+IHsKICAgIHB1YmxpYzoKICAgICAgIHN0YXRpYyBjb25zdCBpbnQgQ2xhc3NJZCA9IChpbnQpQ2xhc3NJZHM6OkRlcml2ZWRJRDsKICAgICAgIAoJICAgdmlydHVhbCB2b2lkIGZvbygpIHsgfQoJICAgdmlydHVhbCBpbnQgYmFyKCkgeyByZXR1cm4gMTsgfQogICAgICAgCiAgICB9OwogICAgCmludCBtYWluKCkgewoJRGVyaXZlZCBkZXI7CglJbnRlcmZhY2UqIGlmYWNlID0gJmRlcjsKCWlmYWNlLT5mb28oKTsKCWlmYWNlLT5iYXIoKTsKCglyZXR1cm4gMDsKfQ==