#include <iostream>
#include <vector>
#include <memory>

class Base { public: Base() { std::cout << "Base-Ctor" << std::endl; }};
std::vector<Base*> elements;

template <typename T>
class A : public Base
{
public:
    A()
    {
        std::cout << "A-Ctor begin" << std::endl;
        elements.push_back(&(T::get()));
        std::cout << "A-Ctor end" << std::endl;
    }
};
class B : public A<B>
{
public:
    B() { std::cout << "B-Ctor" << std::endl; }
    static B& get() 
    { 
        std::cout << "create static" << std::endl; 
        static B b; 
        std::cout << "return static" << std::endl; 
        return b; 
    }
};

int main(void)
{
    B b;

    std::cout << elements.size() << std::endl;
}