Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 13.3. Множественное наследование
1: // Листинг 13.3. Множественное наследование. 2: // Множественное наследование 3: 4: #include < iostream.h> 5: 6: class Horse 7: { 8: public: 9: Horse() { cout < < " Horse constructor... "; } 10: virtual ~Horse() { cout < < " Horse destructor... "; } 11: virtual void Whinny() const { cout < < " Whinny!... "; } 12: private: 13: int itsAge; 14: }; 15: 16: class Bird 17: { 18: public: 19: Bird() { cout < < " Bird constructor... "; } 20: virtual ~Bird() { cout < < " Bird destructor... "; } 21: virtual void Chirp() const { cout < < " Chirp... "; } 22: virtual void Fly() const 23: { 24: cout < < " I can fly! I can fly! I can fly! "; 25: } 26: private: 27: int itsWeight; 28: }; 29: 30: class Pegasus: public Horse, public Bird 31: { 32: public: 33: void Chirp() const { Whinny(); } 34: Pegasus() { cout < < " Pegasus constructor... "; } 35: ~Pegasus() { cout < < " Pegasus destructor... "; } 36: }; 37: 38: const int MagicNumber = 2; 39: int main() 40: { 41: Horse* Ranch[MagicNumber]; 42: Bird* Aviary[MagicNumber]; 43: Horse * pHorse; 44: Bird * pBird; 45: int choice, i; 46: for (i=0; i< MagicNumber; i++) 47: { 48: cout < < " \n(1)Horse (2)Pegasus: "; 49: cin > > choice; 50: if (choice == 2) 51: pHorse = new Pegasus; 52: else 53: pHorse = new Horse; 54: Ranch[i] = pHorse; 55: } 56: for (i=0; i< MagicNumber; i++) 57: { 58: cout < < " \n(1)Bird (2)Pegasus: "; 59: cin > > choice; 60: if (choice == 2) 61: pBird = new Pegasus; 62: else 63: pBird = new Bird; 64: Aviary[i] = pBird; 65: } 66: 67: cout < < " \n"; 68: for (i=0; i< MagicNumber; i++) 69: { 70: cout < < " \nRanch[" < < i < < " ]: 71: Ranch[i]-> Whinny(); 72: delete Ranch[i]; 73: } 74: 75: for (i=0; i< MagicNumber; i++) 76: { 77: cout < < " \nAviary[" < < i < < " ] 78: Aviary[i]-> Chirp(); 79: Aviary[i]-> Fly(); 80: delete Aviary[i]; 81: } 82: return 0; 83: }
Результат: (1)Horse (2)Pegasus: 1 Horse constructor... (1)Horse (2)Pegasus: 2 Horse constructor... Bird constructor... Pegasus constructor... (1)Bird (2)Pegasus: 1 Bird constructor... (1)6ird (2)Pegasus: 2 Horse constructor... Bird constructor... Pegasus constructor... Ranch[0]: Whinny!... Horse destructor... Ranch[1]: Whinny!... Pegasus destructor... Bird destructor... Horse destructor... Aviary[0]: Chirp... I can fly! I can fly! I can fly! Bird destructor... Aviary[1]: Whinny!... I can fly! I can fly! I can fly! Pegasus destructor... Bird destructor... Horse destructor...
Анализ: В строках 6—14 объявляется класс Horse. Конструктор и деструктор выводят на экран сообщения о своей работе, а метод Whinny() печатает Whinny! (И-го-го). Класс Bird объявляется в строках 16—28. В дополнение к своим конструктору и деструктору этот класс содержит два метода: Chirp() и Fly(), каждый из которых выводит на экран соответствующие сообщения. В реальных программах эти методы могут воспроизводить определенный звуковой файл или управлять анимационными эффектами на экране. Наконец, в строках 30-36 объявляется класс Pegasus. Он производится сразу от двух базовых классов — Bird и Horse. В классе замешается метод Chirp() таким образом, что вызывается метод Whinny(), который унаследован этим классом от класса Horse. Создается два списка: Ranch (конюшня), который в строке 41 связывается с классом Horse, и Aviary (птичник), который в строке 42 связывается с классом Bird. В строках 46—55 в список Ranch добавляются два объекта — Horse и Pegasus. В строках 56—65 в список Aviary добавляются объекты Bird и Pegasus. Вызовы виртуальных методов с помощью указателей классов Bird и Horse одинаково выполняются для объекта Pegasus. Например, в строке 78 метод Chirp() вызывается последовательно для всех объектов, указатели на которые представлены в массиве Aviary. Поскольку этот метод объявлен в классе Bird как виртуальный, он правильно Выполняется для всех объектов списка. По выводимым на экран строкам можно заключить, что при создании объекта Pegasus вызываются конструкторы всех трех классов — Bird, Horse и Pegasus, каждый из которых создает свою часть объекта. При удалении объекта также удаляются его части, относящиеся к классам Bird и Horse, для чего деструкторы в этих классах объявлены как виртуальные.
|