#include <iostream>
#include <functional>

// ──────────────────────────────────────────────────────────────────────────────

using CallbackType = std::function<void(void*)>;

// ──────────────────────────────────────────────────────────────────────────────

class Karbofos {
  
    CallbackType *Begin = nullptr;
    CallbackType *End = nullptr;
  
  public:
  
    const std::string Name = "Карбофос";
    
    void SetCallback(CallbackType *B, CallbackType *E) {
      Begin = B;
      End = E;
    }
    
    void Run() {
      if (Begin) (*Begin)(this);
      std::cout << "- Не отдам, слон - мой!\n";
      if (End) (*End)(this);
    }
    
};

// ──────────────────────────────────────────────────────────────────────────────

void Shef(void* i) {
  std::cout << "- Стой, живодер " << ((Karbofos*)(i))->Name << "!\n";	
}

// ──────────────────────────────────────────────────────────────────────────────

void Kollega(void* i) {
  std::cout << "- " << ((Karbofos*)(i))->Name << ", ты немец и контрабандист!\n";	
}

// ──────────────────────────────────────────────────────────────────────────────

int main() {
  Karbofos Object;	
  CallbackType S = Shef;
  CallbackType K = Kollega;
  Object.SetCallback(&S,&K);
  Object.Run();
  return 0;
}