fork(1) download
  1. #include <iostream>
  2. using std::cout;
  3.  
  4. #include <memory>
  5. using std::unique_ptr;
  6.  
  7. #include <vector>
  8. using std::vector;
  9.  
  10. class Base{ public: virtual ~Base() {}; };
  11. class A : public Base { public: virtual ~A() {} };
  12. class B : public Base { public: virtual ~B() {} };
  13. class C : public Base { public: virtual ~C() {} };
  14.  
  15. void f(Base* b) { cout << "Calling Base :(\n"; }
  16. void f(A* a) { cout << "It is an A!\n"; }
  17. void f(B* b) { cout << "It is a B\n"; }
  18. void f(C* c) { cout << "It is a C!\n"; }
  19.  
  20. template<class Derived>
  21. void push(vector<unique_ptr<Base>>& v, Derived* obj)
  22. {
  23. v.push_back(std::unique_ptr<Derived>{obj});
  24. }
  25.  
  26. int main() {
  27. vector<unique_ptr<Base>> v{};
  28. push(v, new A{});
  29. push(v, new B{});
  30. push(v, new C{});
  31.  
  32. for(auto& obj : v)
  33. {
  34. f(obj.get());
  35. }
  36.  
  37. return 0;
  38. }
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
Calling Base :(
Calling Base :(
Calling Base :(