![]() |
|
Программирование >> Дополнительные возможности наследования
в случае использования множественного наследования возникает ряд непростых и весьма интересных вопросов. Например, что произойдет, если оба базовых класса будут иметь одно и то же имя либо содержать виртуальные функции или данные с одинаковыми именами? Как инициализируются конструкторы разных базовых классов? Что произойдет, если два базовых класса будут произведены от одного и того же родительского класса? Все эти вопросы будут рассмотрены в следующем разделе, после чего можно переходить к практическому использованию множественного наследования. Конструкторы классов, оолдчвнных в рвзультатв мнвжвстввнново наслсдвоания Если класс Pegasus производится от двух базовых классов - Bird и Horse, а в каждом из них объявлены конструкторы со списками параметров, то класс Pegasus инициализирует эти конструкторы. Как это происходит, показано в листинге 13.4. Листинг 13.4. Созданнв оОъЕктов нри мнвжвстввннвм насжвдввании 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Листинг 13.4. Создание обьектов при множественном наследовании ffinclude <iostream.h> typedef int HANDS; enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown }; class Horse { public: Horse(COLOR color, HANDS height); virtual HorseO { cout Horse destructor. . .\ n ; } virtual void Whinny()const { cout Whinny!... ; } virtual HANDS GetHeight() const { return itsHeight; } virtual COLOR GetColorO const { return itsColor; } private: HANDS itsHeight; COLOR itsColor; Horse::Horse(COLOR color, HANDS height): itsColor(color),itsHeight(height) cout << Horse constructor...\ n ; class Bird { public: Bird(COLOR color, bool migrates); virtual BirdO { cout Bird destructor. .. \ n ; } virtual void ChirpOconst { cout Chirp... ; } virtual void FlyOconst 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 cout I can fly! I can fly! I can fly! ; virtual COLOR GetColor()oonst { return itsColor; } virtual bool GetMigration() const { return itsMigration; } private: COLOR itsColor; bool itsMigration; } ; Bird: :Bircl(COLOR color, bool migrates): itsColor(color), itsMigration(migrates) cout Bird constructor...\ n ; class Pegasus : public Horse, public Bird { public: void Chirp()const { WhinnyO; } Pegasus(COLOR, HANDS, bool,long); PegasusO { cout << Pegasus destructor. .. \ n ;} virtual long GetNumberBelieversO const return itsNumberBelievers; private: long itsNumberBelievers; > ; Pegasus::Pegasus( COLOR aColor, HANDS height, bool migrates, long NumBelieve): Horse(aColor, height), Bird(aColor, migrates), itslumberBelievers(lumBelieve) { cout << Pegasus constructor...\ n ; int mainO { Pegasus рРед = new Pegasus(Red, 5, true, 10); pPeg->Fly(); pPeg->Whinny(); cout \ nYour Pegasus is pPeg->GetHeight(); cout << hands tall and ; 84 85 86 87 90 91 92 if (pPeg->GetMigration()) cout it does migrate. ; else cout << it does not migrate. ; cout \ nA total of pPeg->GetNumberBelievers(); cout << people believe it exists.\ n ; delete pPeg; return 0; r Horse constructor. . . Bird constructor. . . Pegasus constructor. I can fly! I can fly! I can fly! Whinny!.., Your Pegasus is 5 hands tall and it does migrate. A total of 10 people believe it exists. Pegasus destructor... Bird destructor. . . Horse destructor... Класс Horse объявляется в строках 7-18. Конструктор этого класса принимает два параметра: один из них - это перечисление, объявленное в строке 5, а второй - новый тип, объявленный с помощью typedef в строке 4. Этот конструктор выполняется в строках 20-24. При этом инициализируется одна переменная-член и на экран выводится сообщение о работе конструктора класса Horse. В строках 26-42 объявляется класс Bird, конструктор которого выполняется в строках 45-49. Конструктор этого класса также принимает два параметра. Обратите внимание на интересный факт: конструкторы обоих классов принимают перечисления цветов, с помощью которых в программе можно установить цвет лощади или цвет перьев у птицы. В результате, когда вы попытаетесь установить цвет Пегаса, может возникнуть проблема в работе программы, которая обсуждается несколько ниже. Класс Pegasus объявляется в строках 50-63, а его конструктор - в строках 65-75. Инициализация объекта Pegasus выполняется тремя строками программы. Сначала конструктор класса Horse определяет цвет и рост. Затем конструктор класса Bird инициализируется цветом перьев и логической переменной. Наконец, происходит инициализация переменной-члена itsNumberBelievers, относящейся к классу Pegasus. После всех этих операций вызывается конструктор класса Pegasus. В функции mainO создается указатель на класс Pegasus, который используется для получения доступа к функциям-членам базовых объектов. Двусмысленность ситуации в листинге 13.4 оба класса - Horse и Bird - имеют метод GetColor(). В программе может потребоваться возвратить цвет объекта Pegasus, но возникает вопрос: какой из двух унаследованных методов при этом будет использоваться? Ведь методы, объявленные в обоих базовых классах, имеют одинаковые имена и сигнатуры. В результате при компилировании программы возникнет неопределенность, которую необходимо разрешить до компиляции.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |