Advertisement
Guest User

Untitled

a guest
Oct 26th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. struct Food {
  4. Food() { cout << "Food constructor" << endl; }
  5. ~Food() { cout << "Food destructor" << endl; }
  6. };
  7. struct Predator {
  8. void eat(Food& food) { food.~Food(); }
  9. void eat(Food* food) { delete food; }
  10. };
  11.  
  12. int main()
  13. {
  14. Predator p;
  15. Food *f1 = new Food;
  16. Food *f2 = new Food;
  17. p.eat(*f1);
  18. p.eat(f2);
  19. return 0;
  20. }
  21.  
  22. #include <iostream>
  23. using namespace std;
  24. struct Food {
  25. Food() { cout << "Food constructor" << endl; }
  26. void die() { delete this; }
  27. private:
  28. ~Food() { cout << "Food destructor" << endl; }
  29. };
  30. struct Predator {
  31. void eat(Food& food) { food.die(); }
  32. void eat(Food* food) { food->die(); }
  33. };
  34.  
  35. int main()
  36. {
  37. Predator p;
  38. Food *f1 = new Food;
  39. Food *f2 = new Food;
  40. // Food f3; --> compile time error
  41. p.eat(*f1);
  42. // delete f2; --> compile time error
  43. p.eat(f2);
  44. // f2->die(); --> а это скомпилируется, но UB, если f2 уже съеден
  45. return 0;
  46. }
  47.  
  48. #include <iostream>
  49.  
  50. using namespace std;
  51.  
  52. struct Animal {
  53. virtual void die() = 0;
  54. virtual void eat(Animal*) = 0;
  55. protected: virtual ~Animal() {}
  56. };
  57.  
  58. struct Sheep : public Animal
  59. {
  60. Sheep() { cout << "Sheep constructor" << endl; }
  61. void die() { delete this; }
  62. void eat(Animal* food) {/* овечка не может съесть животное */ cout << "impossible" << endl;}
  63. private:
  64. ~Sheep() { cout << "Sheep destructor" << endl; }
  65. };
  66.  
  67. struct Wolf : public Animal
  68. {
  69. void eat(Animal* food) { food->die(); }
  70. void die() { delete this; }
  71. private:
  72. ~Wolf() {}
  73. };
  74.  
  75. int main()
  76. {
  77. Animal *s1 = new Sheep, *s2 = new Sheep, *s3 = new Sheep;
  78. Animal *w1 = new Wolf, *w2 = new Wolf;
  79. w1->eat(s1);
  80. w2->eat(s2);
  81. s3->eat(w1); // Смело...
  82. s3->die(); // От старости... Или со страху.
  83. w1->eat(w2); // Не повезло 2-му.
  84. w1->die(); // От обжорства...
  85. return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement