Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 13.5. Общий базовый класс
1: // Листинг 13.5. 2: // Общий базовый класс 3: #include < iostream.h> 4: 5: typedef int HANDS; 6: enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown } 7: 8: class Animal // общий базовый класс для классов horse и bird 9: { 10: public: 11: Animal(int); 12: virtual ~Animal() { cout < < " Animal destructor...\n"; } 13: virtual int GetAge() const { return itsAge; } 14: virtual void SetAge(int age) { itsAge = age; } 15: private: 16: int itsAge; 17: }; 18: 19: Animal:: Animal(int age): 20: itsAge(age) 21: { 22: cout < < " Animal constructor...\n"; 23: } 24: 25: class Horse: public Animal 26: { 27: public: 28: Horse(COLOR color, HANDS height, int age); 29: virtual ~Horse() { cout < < " Horse destructor...\n"; } 30: virtual void Whinny()const { cout < < " Whinny!... "; } 31: virtual HANOS GetHeight() const { return itsHeight; } 32: virtual COLOR GetColor() const { return itsColor; } 33: protected: 34: HANDS itsHeight; 35: COLOR itsColor; 36: }; 37: 38: Horse:: Horse(C0L0R color, HANDS height, int age): 39: Animal(age), 40: itsColor(color), itsHeight(height) 41: { 42: cout < < " Horse constructor...\n"; 43: } 44: 45: class Bird: public Animal 46: { 47: public: 48: Bird(COLOR color, bool migrates, int age); 49: virtual ~Bird() { cout < < " Bird destructor...\n"; } 50: virtual void Chirp()const { cout < < " Chirp... "; } 51: virtual void Fly()const 52: { cout < < " I can fly! I can fly! I can fly! "; } 53: virtual C0L0R GetColor()const { return itsColor; } 54: virtual bool GetMigration() const { return itsMigration; } 55: protected: 56: COLOR itsColor; 57: bool itsMigration; 58: }; 59: 60: Bird:: Bird(COLOR color, bool migrates, int age): 61: Animal(age), 62: itsColor(color), itsMigration(migrates) 63: { 64: cout < < " Bird constructor...\n"; 65: } 66: 67: class Pegasus: public Horse, public Bird 68: { 69: public: 70: void Chirp()const { Whinny(); } 71: Pegasus(COLOR, HANDS, bool, long, int); 72: virtual ~Pegasus() { cout < < " Pegasus destructor...\n"; } 73: virtual long GetNumberBelievers() const 74: { return itsNumberBelievers; } 75: virtual COLOR GetColor()const { return Horse:: itsColor; } 76: virtual int GetAge() const { return Horse:: GetAge(); } 77: private: 78: long itsNumberBelievers; 79: }; 80: 81: Pegasus:: Pegasus( 82: COLOR aColor, 83: HANDS height, 84: bool migrates, 85: long NumBelieve, 86: int age): 87: Horse(aColor, height, age), 88: Bird(aColor, migrates, age), 89: itsNumberBelievers(NumBelieve) 90: { 91: cout < < " Pegasus constructor...\n"; 92: } 93: 94: int main() 95: { 96: Pegasus *pPeg = new Pegasus(Red. 5, true, 10, 2); 97: int age = pPeg-> GetAge(); 98: cout < < " This pegasus is " < < age < < " years old.\n"; 99: delete pPeg; 100: return 0; 101: }
Результат: Animal constructor... Horse constructor... Animal constructor... Bird constructor... Pegasus constructor... This pegasus is 2 years old. Pegasus destructor.,. Bird destructor... Animal destructor... Horse destructor... Animal destructor...
Анализ: В листинге содержится ряд интересных решений. Так, в строках 8—17 объявляется новый класс Animal с переменной-членом itsAge и двумя методами — GetAge() и SetAge(). В строке 25 класс Horse производится от класса Animal. Конструктор класса Horse теперь имеет третий параметр age, который передается в базовый класс Animal. Обратите внимание, что в классе Horse метод GetAge() не замещается, а просто наследуется. В строке 46 класс Bird производится от класса Animal. Конструктор этого класса также содержит параметр age, с помощью которого инициализируется базовый класс Animal. Метод GetAge() также наследуется этим классом без замещения. Класс Pegasus производится от двух базовых классов Horse и Bird, поэтому с исходным базовым классом Animal он связан двумя линиями наследования. Если для объекта класса Animal будет вызван метод GetAge(), то для преодоления неопределенности нужно точно указать, к какому базовому классу следует обращаться за этим методом, либо метод GetAge() следует заместить в классе Pegasus. В нашем примере программы метод GetAge() замещается для класса Pegasus таким образом, что в нем явно указывается обращение к аналогичному методу конкретного базового класса. Замещение функции с добавлением обращения к методу базового класса позволяет решить две проблемы. Во-первых, преодолевается неопределенность обращения к базовым классам; во-вторых, функцию можно заместить таким образом, что в производном классе при обращении к этой функции будут выполняться дополнительные операции, которых не было в базовом классе. Причем по желанию программиста эти дополнительные операции могут выполняться до вызова функции базового класса или после вызова с использованием значения, возвращенного функцией базового класса. Конструктор класса Pegasus принимает пять параметров: цвет крылатого коня, его рост (в футах); логическую переменную, которая определяет, мигрирует сейчас это животное или мирно пасется на пастбище; число людей, верящих в существование Пегаса, и возраст животного. В строке 87 конструктор инициализирует переменные, определенные в классе Horse (цвет, рост и возраст). В следующей строке инициализируется часть, относящаяся к классу Bird: цвет, миграции и возраст. Наконец, в строке 89 инициализируется переменная itsNumberBelievers, относящаяся непосредственно к классу Pegasus. Вызов конструктора класса Horse в строке 87 выполняет операторы, записанные в строке 38. С помощью параметра age конструктор класса Horse инициализирует переменную itsAge, унаследованную классом Horse от класса Animal. Затем инициализируются две переменные-члена класса Horse — itsColor и itsHeight. Вызов конструктора класса Bird в строке 88 выполняет операторы, записанные в строке 60. И в данном случае параметр age используется для инициализации переменной-члена, унаследованной классом Bird от класса Animal. Обратите внимание, что значение параметра цвета объекта Pegasus используется для инициализации соответствующих переменных-членов обоих классов, Bird и Horse. Параметр age также инициализирует переменную itsAge обоих этих классов, унаследованную ими от базового класса Animal.
|