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

Думаю, вам стоит избегать множественного наследования, пока вы в полной мере не освоите С++. Обычное наследование тоже достаточно мощный механизм. Исключением может стать библиотека Microsoft Foundation Classes ( MFC ), в которой множественное наследование используется сплошь и рядом. Однако эти классы тщательно выверены профессиональными высококвалифицированными программистами.

Только не поймите меня неправильно! Я не против множественного наследования. То, что Microsoft и другие компании эффективно используют множественное наследование в своих классах, доказывает, что так можно делать. Если бы этот механизм не стоил того, они бы его не использовали. Однако это отнюдь не значит, что множественное наследование имеет смысл применять, едва познакомившись с ним.

_________________

307 стр. Глава 26. Множественное наследование 

Глава 27. ШАБЛОНЫ С++...308

ОГЛАВЛЕНИЕ

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

►Обобщение функции в шаблон 309

►Шаблоны классов 311

►Зачем нужны шаблоны классов 314

►Советы по использованию шаблонов 316

Стандартная библиотека С++ предоставляет программисту множество различных функций. В ней представлены математические функции, функции для работы со временем и датами, функции ввода-вывода, системные функции. Во многих программах в этой книге использованы, например, функции для работы с нуль-завершёнными строками ( эти функции объявлены в заголовочном файле strings.h ). Типы аргументов большинства функций фиксированы. Так, например, оба аргумента функции strcpy( char* , const char* ) являются указателями на нуль-завершённые строки — любые другие типы аргументов для данной функции просто лишены смысла.

Есть функции, которые могут быть применены к различным типам данных. Рассмотрим, например, функцию maximum( ), которая возвращает больший из двух аргументов. Все объявления функции, приведённые в табл. 27.1, имеют смысл.

    Таблица 27.1. Возможные варианты функции maximum( )

    _________________

    Имя функции — Выполняемые действия

    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

    maximum( int , int ) — Возвращает большее из двух целых чисел

    maximum( unsigned int , unsigned int ) — Возвращает большее из двух беззнаковых целых чисел

    maximum( double , double ) — Возвращает большее из двух чисел с плавающей точкой

    maximum( char , char ) — Возвращает символ, находящийся далее в алфавитном порядке

     ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ 

Я бы хотел реализовать функцию maximum( ) для всех четырёх случаев. Само собой, С++ может привести все эти типы к типу double, т.е. мне достаточно разработать функцию maximum ( double , double ), которая удовлетворит все мои потребности. Так ли это? Рассмотрим следующий код.

    /* Прототип функции maximum */

    double maximum( double , double ) ;

    /* Пользовательская функция */

    void fn ( int nArg1 , int nArg2 )

    {

        int nLarger = ( int )maximum( ( double )nArg1 ,

                                   ( double )nArg2 ) ;

        /* ... прочие действия ... */

    } 

_________________

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

В такой ситуации целочисленные параметры должны быть сначала приведены к типу double ( с потерей точности ). Функция возвращает значение double, которое теперь надо преобразовать к типу int. Функция может работать и без потери точности, но выполнение всех этих преобразований делает её куда более медленной, чем она могла бы быть. Словом, эта функция в любом случае работает не так, как ожидает ( или надеется ) пользователь.

Конечно, функцию maximum( ) можно просто перегрузить.

    double maximum( double d1 , double d2 )