    #include <memory>

    struct Listener {};
    struct TCP : public Listener {};
    struct Domain : public Listener {};
    struct A {};
    struct Branch : public TCP, public A {};
    struct DIAMOND : public TCP, public Domain {};

    int main() {
        std::unique_ptr<Listener> ptr;
        ptr.reset(new TCP);
        ptr.reset(new Domain);
        ptr.reset(new Branch);
        ptr.reset(new DIAMOND);
    }
