#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;
}