// Uppgift: Blanda en lista med djur och få dem att prata. // Nyckelord: Arv, Polymorfi, virtuel, slump, typeinfo: typeid, std::vector, std::random_shuffle #include #include #include #include #include using namespace std; class Animal { public: virtual ~Animal() {} virtual string talk() { return "Hear, hear"; } }; class Cat : public Animal { string talk() { return Animal::talk() + ": Miow"; } }; class Dog : public Animal { string talk() { return "Woff"; } }; class Cow : public Animal { string talk() { return "Muu"; } }; class Sheep : public Animal { string talk() { return "Baa-aa"; } }; int main() { srand(time(0)); vector v; v.push_back(new Cat); v.push_back(new Cat); v.push_back(new Dog); v.push_back(new Dog); v.push_back(new Cow); v.push_back(new Cow); v.push_back(new Sheep); v.push_back(new Sheep); random_shuffle(v.begin(), v.end()); for (auto it = v.begin(); it != v.end(); ++it) cout << (*it)->talk() << endl; for (auto it = v.begin(); it != v.end(); ++it) delete *it; Animal* a = new Animal; Cat* c = new Cat; Animal* ac = c; Dog* d = new Dog; Animal* ad = d; cout << "--- Typid's:" << endl; cout << typeid(ac).name() << endl; cout << typeid(*ac).name() << endl; cout << typeid(ad).name() << endl; cout << typeid(*ad).name() << endl; cout << "--- Typid's compared:" << endl; cout << "a and ac is "; cout << (typeid(a) == typeid(ac) ? "compatible" : "different") << endl; cout << "*a and *ac is "; cout << (typeid(*a) == typeid(*ac) ? "compatible" : "different") << endl; cout << "ad and ac is "; cout << (typeid(ad) == typeid(ac) ? "compatible" : "different") << endl; cout << "*ad and *ac is "; cout << (typeid(*ad) == typeid(*ac) ? "compatible" : "different") << endl; cout << "a and c is "; cout << (typeid(a) == typeid(c) ? "compatible" : "different") << endl; cout << "ac and c is "; cout << (typeid(ac) == typeid(c) ? "compatible" : "different") << endl; cout << "*ad and *d is "; cout << (typeid(*ad) == typeid(*d) ? "compatible" : "different") << endl; cout << "c and d is "; cout << (typeid(c) == typeid(d) ? "compatible" : "different") << endl; return 0; }