You are on page 1of 4

Class Exercise 11: Multiple Inheritance

Object-Oriented Programming (83-131), 5771

1) Multiple Inheritance
class Horse { public: Horse() { cout << "Horse constructor... "; } virtual ~Horse() { cout << "Horse destructor... "; } virtual void Whinny() const { cout << "Whinny!... "; } private: int itsAge; }; class Bird { public: Bird() { cout << "Bird constructor... "; } virtual ~Bird() { cout << "Bird destructor... "; } virtual void Chirp() const { cout << "Chirp... "; } virtual void Fly() const { cout << "I can fly! I can fly! I can fly! "; } private: int itsWeight; }; const int MagicNumber = 2; int main() { Horse* Ranch[MagicNumber]; Bird* Aviary[MagicNumber]; Horse * pHorse; Bird * pBird; int choice,i; for (i=0; i<MagicNumber; i++) { cout << "\n(1)Horse (2)Pegasus: "; cin >> choice; if (choice == 2) pHorse = new Pegasus; else pHorse = new Horse; Ranch[i] = pHorse; } for (i=0; i<MagicNumber; i++) { cout << "\n(1)Bird (2)Pegasus: "; cin >> choice; if (choice == 2) pBird = new Pegasus; else pBird = new Bird; Aviary[i] = pBird; } cout << "\n"; for (i=0; i<MagicNumber; i++) { cout << "\nRanch[" << i << "]: " ; Ranch[i]->Whinny(); delete Ranch[i]; } for (i=0; i<MagicNumber; i++) { cout << "\nAviary[" << i << "]: " ; Aviary[i]->Chirp(); Aviary[i]->Fly(); delete Aviary[i]; // For Pegasus: Pegasus destructor. Bird destructor. Horse destructor. } return 0; } class Pegasus : public Horse, public Bird { public: void Chirp() const { Whinny(); } Pegasus() { cout << "Pegasus constructor... "; } ~Pegasus() { cout << "Pegasus destructor... } };

";

Class Exercise 11: Multiple Inheritance

Object-Oriented Programming (83-131), 5771

2) Common Ancestor Problems


class Animal { int _age; public: Animal(int age) : _age(age) {} virtual ~Animal() {} int getAge() { return _age; } virtual void Sound() const = 0; };

Reminder: we must implement a virtual destructor if we use a base pointer to delete the object.

class Horse : public Animal { public: Horse(int age) : Animal(age) {} virtual void Sound() const { cout << "Whinny!... "; } }; class Bird : public Animal { public: Bird(int age) : Animal(age) {} virtual void Sound() const { cout << "Chirp... "; }; class Pegasus : public Horse, public Bird { public: Pegasus(int age) : Horse(age), Bird(age) {} };

int main() { Animal* farm[] = {new Horse(1), new Bird(2), NULL}; // farm[2] = new Pegasus(3) // error C2594: 'initializing' : ambiguous conversions from 'Pegasus *' to 'Animal *' farm[2] = (Horse*)(new Pegasus(3)); for (int i = 0; i < 2; ++i) cout << farm[i]->getAge(); for (int i = 0; i < 3; ++i) delete farm[i]; Pegasus peg(3); // cout << peg.getAge(); // error C2385: ambiguous access of 'getAge' cout << ((Horse)peg).getAge(); return 0; }

Class Exercise 11: Multiple Inheritance

Object-Oriented Programming (83-131), 5771

3) Virtual Inheritance
class Animal { int _age; public: Animal(int age) : _age(age) {} int getAge() { return _age; } virtual void Sound() const = 0; virtual ~Animal() {}; }; class Horse : virtual public Animal { public: Horse(int age) : Animal(age) {} virtual void Sound() const { cout << "Whinny!... "; } }; class Bird : virtual public Animal { public: Bird(int age) : Animal(age) {} virtual void Sound() const { cout << "Chirp... "; };

class Pegasus : public Horse, public Bird { public: // We must activate the constructor of Animal Pegasus(int age) : Animal(age), Horse(age), Bird(age) {} // We must implement Sound() or we would get: // error C2250: 'Pegasus' : ambiguous inheritance of 'void Animal::Sound(void) const' virtual void Sound() const { Horse::Sound(); } };

int main() { Animal* farm[] = {new Horse(1), new Bird(2), new Pegasus(3)}; for (int i = 0; i < 3; ++i) { cout << farm[i]->getAge(); farm[i]->Sound(); } for (int i = 0; i < 3; ++i) delete farm[i]; return 0; }

Class Exercise 11: Multiple Inheritance

Object-Oriented Programming (83-131), 5771

4) Inheritance as Interfaces (a Java concept)


Class CanEvaluate { public: virtual int Evaluate() = 0; }; class Person : public CanEvaluate { public: int Evaluate() { return age; } private: int age; }; class Shape : public CanEvaluate { public: int Evaluate() { return area; } private: int area; }; void test(CanEvaluate& obj) { if (obj.Evaluate() > 10) cout << "YES!!!" << endl; }

You might also like