fork download
  1. #include <iostream>
  2. #include <memory>
  3. #include <vector>
  4.  
  5.  
  6. template<class Item>
  7. class BaseTemplate
  8. {
  9. protected:
  10. // no need to make these public
  11. typedef std::shared_ptr<Item> ItemPtr;
  12. typedef std::vector<ItemPtr> Items;
  13.  
  14. public:
  15. BaseTemplate() {}
  16.  
  17. virtual ~BaseTemplate() = 0;
  18.  
  19. virtual void Process() = 0;
  20.  
  21. // it's better to avoid giving the user access to the shared_ptr objects
  22. // this way you are the *only* owner
  23. const Item & getItem(std::size_t index) const { return *mItems[index]; }
  24.  
  25. protected:
  26. void addItem(const ItemPtr & inItem)
  27. {
  28. mItems.push_back(inItem);
  29. }
  30.  
  31. private:
  32. // only base class needs to be noncopyable
  33. BaseTemplate(const BaseTemplate&) = delete;
  34. BaseTemplate& operator=(const BaseTemplate&) = delete;
  35.  
  36. Items mItems; // data members should be private, not protected
  37. };
  38.  
  39.  
  40. template<typename Item>
  41. BaseTemplate<Item>::~BaseTemplate()
  42. {
  43. }
  44.  
  45.  
  46. class DerClassA: public BaseTemplate<int>
  47. {
  48. public:
  49. // you don't need to write empty constructor
  50.  
  51. // empty virtual destructor is required you want to allow inheritance from this class
  52. virtual ~DerClassA() {}
  53.  
  54. virtual void Process() {
  55. std::cout << "HELLO I AM: DerClassA" << std::endl;
  56. addItem(std::make_shared<int>(3)); //This will push_back objects to m_pContainer
  57. }
  58. };
  59.  
  60.  
  61. int main()
  62. {
  63. DerClassA a;
  64. a.Process();
  65. }
  66.  
Success #stdin #stdout 0s 3024KB
stdin
Standard input is empty
stdout
HELLO I AM: DerClassA