Программирование >>  Аргументация конструирования 

1 ... 95 96 97 [ 98 ] 99 100 101 ... 108


class InvalidArgumentException : public Exception {

public:

InvalidArgumentException ( ir. g, char* pFile,

int nLine)

:Exception( НеБерный аргумент , pFile, nLine)

invArg = arg;

virtual void display(ostreams out)

Exception::display(out);

cut < ртумент равен < Arg << endl;

protected:

int invArg;

Несмотря на то что в блоке catch указан класс Exception, исключение InvalidArgumentException будет успешно обработано, поскольку InvalidArgumentException ЯВЛЯЕТСЯ Exception, а функция-член display!) полиморфна.



Гл28

Множественное наследование

Механизм множественного наследования Устранение неоднозначностей множественного наследования Виртуальное наследование Конструирование объектов

/ Отрицательные стороны множественного наследования

иерархиях классов, которые рассматривались в книге, каждый класс

следовался от одного прародителя. Такое одиночное наследование подходит для описания большинства объектов реального мира. Однако некоторые классы представляют собой сочетание нескольких классов в одном.

Примером такого класса может служить диван-кровать. Как видно из названия,

это и диван и кровать (правда, кровать не очень удобная). Таким образом, этот предмет интерьера наследует свойства как дивана, так и кровати. В терминах C + + эту ситуацию можно описать следующим образом: класс может быть наследником более чем одного базового класса. Такое наследование называется множественным.

МеанизмммжеаЯеенного

HotueqooHUA

Чтобы увидеть множественное наследование в действии, я продолжу пример с диваном-кроватью. На рис. 28.1 приведена схема наследования дивана-кровати (класс SleeperSof а). Обратите внимание, что этот класс наследует свойства и от класса Bed (Кровать), и от класса Sofa (Диван), т.е. наследует свойства обоих классов.

Safe

LwatchTV( w£


SleeperSofa

ifoldOutO.

Рис. 28.1. Иерархия классов дивана-кровати



Программная реализация класса rSofа влядит следующим образом:

class Bed

public:

BedOv }

void sleep () {} int weight;

class Sofa

public:

Sofa ()(}

void v;atchTV() { }

int weight;

eiSofa - это одновременно и кровать и диван class SleeperSofa : public Bed, public Sofa {

public :

SleeperSofa(){} void foldOutO { }

in n(int argcs, char* pArgs[])

SleeperSofa SS;

Вы можете смотреть телевизор, сидя на диване... .ss.watchTvQ ; Sofa: :watchTV()

. а потом можете разложить его. . . ss.foJdOutO ; SieeperSofa: : foldOut О

. спать на нем как на кровати

ss.sleepO; Bed:: sleep О

return О;

В этом примере класс SieeperSofa наследует оба класса - Bed и Sofa. Это видно из их наличия в объявлении класса SieeperSofa, который наследует все члены от обоих базов1х классов. Таким образом, допустимы оба вызова - как ss . sleep (), так и ss.watchTVO. Вы можете использовать SieeperSofa и как Bed, и как Sofa. Кроме того, класс SieeperSofa имеет собственные члены, например foldOut ().

УаЯшяение яеодяозяачмайей итожеаенлого нсииедоания

Будучи весьма мошной возможностью языка, множественное наследование может стать в то же время и источником проблем. Одну из них можно увидеть уже в преды-лущем примере. Обратите внимание, что оба класса - Bed и Sofa - содержат чден

weight (вес). Это логично, потому что они оба имеют некоторый вполне измеримый

вес. Вопрос: какой именно член weight наследует класс SieeperSofa?



1 ... 95 96 97 [ 98 ] 99 100 101 ... 108

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