Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- struct Food {
- Food() { cout << "Food constructor" << endl; }
- ~Food() { cout << "Food destructor" << endl; }
- };
- struct Predator {
- void eat(Food& food) { food.~Food(); }
- void eat(Food* food) { delete food; }
- };
- int main()
- {
- Predator p;
- Food *f1 = new Food;
- Food *f2 = new Food;
- p.eat(*f1);
- p.eat(f2);
- return 0;
- }
- #include <iostream>
- using namespace std;
- struct Food {
- Food() { cout << "Food constructor" << endl; }
- void die() { delete this; }
- private:
- ~Food() { cout << "Food destructor" << endl; }
- };
- struct Predator {
- void eat(Food& food) { food.die(); }
- void eat(Food* food) { food->die(); }
- };
- int main()
- {
- Predator p;
- Food *f1 = new Food;
- Food *f2 = new Food;
- // Food f3; --> compile time error
- p.eat(*f1);
- // delete f2; --> compile time error
- p.eat(f2);
- // f2->die(); --> а это скомпилируется, но UB, если f2 уже съеден
- return 0;
- }
- #include <iostream>
- using namespace std;
- struct Animal {
- virtual void die() = 0;
- virtual void eat(Animal*) = 0;
- protected: virtual ~Animal() {}
- };
- struct Sheep : public Animal
- {
- Sheep() { cout << "Sheep constructor" << endl; }
- void die() { delete this; }
- void eat(Animal* food) {/* овечка не может съесть животное */ cout << "impossible" << endl;}
- private:
- ~Sheep() { cout << "Sheep destructor" << endl; }
- };
- struct Wolf : public Animal
- {
- void eat(Animal* food) { food->die(); }
- void die() { delete this; }
- private:
- ~Wolf() {}
- };
- int main()
- {
- Animal *s1 = new Sheep, *s2 = new Sheep, *s3 = new Sheep;
- Animal *w1 = new Wolf, *w2 = new Wolf;
- w1->eat(s1);
- w2->eat(s2);
- s3->eat(w1); // Смело...
- s3->die(); // От старости... Или со страху.
- w1->eat(w2); // Не повезло 2-му.
- w1->die(); // От обжорства...
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement