Выбрать главу

_________________

296 стр. Часть 5. Полезные особенности

«Встроенные макроопределения _FILE_ и _LINE_ представляют собой имя исходного файла и текущую строку в нём.»

[Советы]

Перехватчик исключения использует функцию-член display( ) для вывода сообщения об ошибке. Вывод программы выглядит следующим образом.

    3! = 6

    Ошибка:

    Ошибка <Аргумент факториала отрицателен — значение равно -1> @С:/Documents/Dial/CppDummy/CustomExceptionClass.срр-46

    Press any key to continue...

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

    class InvalidArgumentException : public Exception

    {

    public :

        InvalidArgumentException( int arg , char*pFile , int nLine )

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

        {

              invArg = arg ;

        }

        virtual void display( ostream& out )

        {

              Exception::display( out ) ;

              out << "Аргумент " << invArg << endl ;

        }

    protected :

        int invArg ;

    }

Вызывающая функция автоматически обработает новое исключение, поскольку InvalidArgumentException ЯВЛЯЕТСЯ Exception, а функция-член display( ) — полиморфна.

_________________

297 стр. Глава 25. Обработка ошибок и исключения

Глава 26. МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ...298

ОГЛАВЛЕНИЕ

        В этой главе...

►Механизм множественного наследования 298

►Устранение неоднозначностей множественного наследования 300

►Виртуальное наследование 301

►Конструирование объектов 306

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

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

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

►Механизм, множественного наследования...298

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

   

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

_________________

298 стр. Часть 5. Полезные особенности

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

    //

    /* MultipleInheritance — класс, являющийся наследником */

    /*                        нескольких базовых классов */

    //

    #include <cstdio>

    #include <cstdlib>