Язык программирования C++. Вводный курс


Класс массива с множественным наследованием - часть 2


Оператор взятия индекса переопределен в классах Array_RC и Array_Sort, и обе реализации имеют равный приоритет. Поэтому внутри Array_RC_S неквалифицированное обращение к оператору взятия индекса неоднозначно. Класс Array_RC_S должен предоставить собственную реализацию, иначе пользователи не смогут напрямую применять такой оператор к объектам этого класса. Но какова семантика его вызова в Array_RC_S? При учете отсортированности массива он должен установить в true

унаследованный член dirty_bit. А чтобы учесть наследование от класса с контролем выхода за границы массива – проверить указанный индекс. После этого можно возвращать элемент массива с данным индексом. Последние два шага выполняет унаследованный из Array_RC

оператор взятия индекса. При обращении

return Array_RC<Type>::operator[]( index );

он вызывается явно, и механизм виртуализации не применяется. Поскольку это встроенная функция, то при статическом вызове компилятор подставляет ее код в место вызова.

Теперь протестируем нашу реализацию с помощью функции try_array(), передавая ей по очереди классы, конкретизированные из шаблона Array_RC_S типами int и string:

#include "Array_RC_S.h"

#include "try_array.C"

#include <string>

 

int main()

{

    static int ia[ 10 ] = { 12,7,14,9,128,17,6,3,27,5 };

    static string sa[ 7 ] = {

               "Eeyore", "Pooh", "Tigger",

               "Piglet", "Owl", "Gopher", "Heffalump"

    };

    Array_RC_S<int> iA( ia,10 );

    Array_RC_S<string> SA( sa,7 );

 

    cout << "êîíêðåòèçàöèÿ êëàññà Array_RC_S<int>"

         << endl;

    try_array( iA );

 

    cout << "êîíêðåòèçàöèÿ êëàññà Array_RC_S<string>"

         << endl;

    try_array( SA );

 

    return 0;

<


Начало  Назад  Вперед



Книжный магазин