#include <iostream>

template <typename T>
class Base
{
public:
    void method() {
        static_cast<T*>(this)->method();
    }
};

class Derived1 : public Base<Derived1>
{
public:
    void method() {
        std::cout << "Derived1 method" << std::endl;
    }
};


class Derived2 : public Base<Derived2>
{
public:
    void method() {
        std::cout << "Derived2 method" << std::endl;
    }
};


int main()
{
    Base<Derived1> *d1 = new Derived1;
    Base<Derived2> *d2 = new Derived2;
    d1->method();
    d2->method();
    return 0;
}