Программирование >>  Дополнительные возможности наследования 

1 ... 120 121 122 [ 123 ] 124 125 126 ... 265


Если просто записать:

COLOR currentColor = pPeg->GetColor();

компилятор покажет сообщение об ошибке Member is ambiguous: Horse: :GetColor and Bird: :GetColor (Член не определен).

Эту неопределенность можно разрешить, явно обратившись к методу того класса, который вам необходим:

COLOR currentColor = pPeg->Horse::GetColor();

В любом случае при возникновении подобной ситуации, когда требуется сделать выбор между одноименными методами или переменными-членами разных классов, следует явно указывать имя необходимого базового класса перед именем функции-члена или переменной.

Если в классе Pegasus эта функция будет замещена, то проблема решится сама собой, так как в этом случае вызывается функция-член класса Pegasus:

virtual COLOR GetColor()const { return Horse::GetColor(): }

Таким образом, проблему неопределенности можно обойти благодаря инкапсуляции явного указания базового класса в объявлении замешенной функции. Если возникнет необходимость использовать метод другого класса, то обращение к нему с помощью приведенного ниже выражения не будет ошибкой.

COLOR currentColor = pPeg->Bird::GetColor();

Нашдованив от оОщвго Оазового класса

Что произойдет, если оба базовых класса, от которых производится другой класс, сами были произведены от одного общего базового класса, как, например, классы Bird и Horse от класса Animal. Эта ситуация показана на рис. 13.2.

Animal

Horse

Animal

Bird

Pegasus

Рис. 13.2. Общий базовый класс

Как показано на рис. 13.2, два класса, являющихся базовыми для класса Pegasus, сами производятся от одного общего класса Animal. Компилятор при этом рассматривает классы Bird и Horse как производные от двух одноименных базовых классов, что



может привести к очередной неопределенности. Например, если в классе Animal объявлены переменная-член itsAge и функция-член GetAgeO, а в программе делается вызов pGet->GetAge(), то будет ли при этом вызываться функция GetAgeO, унаследованная классом Bird от класса Animal или классом Horse от базового класса? Это противоречие разрешается в листинге 13.5.

Ансшннг 13.S. ВбщнО базоныО к асс

2 3 4 5 6 7 8 9

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Листинг 13.5.

Общий базовый класс

Sinclude <iostream.h>

typedef int HANDS;

enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown }

class Animal общий базовый класс для классов horse и bird {

public:

Animal(int);

virtual AnimalO { cout Animal destructor. , .\ n ; }

virtual int GetAgeO const < return itsAge; }

virtual void SetAge(int age) { itsAge = age; } private:

int itsAge; > ;

Animal::Animal(int age):

itsAge(age)

cout << Animal constructor...\ n ;

>

class Horse : public Animal {

public:

Horse(C0L0R color, HANDS height, int age); virtual HorseO ( cout Horse destructor. . ,\ n ; } virtual void Whinny()const { cout << Whinny!... ; } virtual HANDS GetHeightO const { return itsHeight; > virtual COLOR GetColor() const { return itsColor; }

protected: HANDS itsHeight; COLOR itsColor;

Horse::Horse(C0L0R color, HANDS height, int age): Animal(age),

itsColor(color),itsHeight(height)

cout << Horse constructor...\ n ;



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 84 85 86 87 88 89 90 91 92

class Bird : public Animal {

public:

Bird(C0L0R color, bool migrates, int age);

virtual BirdO ( cout << Bird destructor, .. \ n ; }

virtual void ChirpOconst { cout << Chirp , ; }

virtual void Fly()const

{ cout I can fly! I can fly! I can fly! ; }

virtual COLOR GetColor()const { return itsColor; }

virtual bool GetMigrationO const { return itsMigration; } protected:

COLOR itsColor;

bool itsMigration; } ;

Bird::Bird(C0L0R color, bool migrates, int age): Animal(age),

itsColor(color), itsMigration(migrates)

cout Bird constructor ,\ n ;

class Pegasus : public Horse, public Bird {

public:

void ChirpOconst { WhinnyO; }

Pegasus(C0L0R, HANDS, bool, long, int);

virtual PegasusO { cout Pegasus destructor. ..\ n ;}

virtual long GetNumberBelieversO const { return ItsNumberBelievers; }

virtual COLOR GetColor()const { return Horse::itsColor; }

virtual int GetAgeO const { return Horse::GetAgeO; } private:

long ItsNumberBelievers; } ;

Pegasus::Pegasus(

COLOR aColor,

HANDS height,

bool migrates,

long NumBelieve,

int age): Horse(aColor, height,age), Bird(aColor, migrates,age), ItsNumberBelievers(NumBelieve) {

cout Pegasus constructor ,\ n ;



1 ... 120 121 122 [ 123 ] 124 125 126 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика