|
Программирование >> Аргументация конструирования
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?
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |