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


Класс массива с множественным наследованием


Определим отсортированный массив с контролем выхода за границы. Для этого можно применить множественное наследование от Array_RC и Array_Sort. Вот как выглядит наша реализация (напомним еще раз, что мы ограничились тремя конструкторами и оператором взятия индекса). Определение находится в заголовочном файле Array_RC_S.h:

#ifndef ARRAY_RC_S_H

#define ARRAY_RC_S_H

 

#include "Array_S.C"

#include "Array_RC.C"

 

template <class Type>

class Array_RC_S : public Array_RC<Type>,

                   public Array_Sort<Type>

{

public:

    Array_RC_S( int sz = Array<Type>::ArraySize )

              : Array<Type>( sz )

              { clear_bit(); }

 

    Array_RC_S( const Array_RC_S &rca )

                 : Array<Type>( rca )

           { sort( 0,Array<Type>::_size-1 ); clear_bit(); }

 

    Array_RC_S( const Type* arr, int sz )

                 : Array<Type>( arr, sz )

                 { sort( 0,Array<Type>::_size-1 ); clear_bit(); }

 

    Type& operator[]( int index )

           {

                  set_bit();

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

     }

};

 

#endif

Этот класс наследует две реализации каждой интерфейсной функции Array: из Array_Sort и из виртуального базового класса Array через Array_RC (за исключением оператора взятия индекса, для которого из обоих базовых классов наследуется замещенный экземпляр). При невиртуальном наследовании вызов find() был бы помечен компилятором как неоднозначный, поскольку он не знает, какой из унаследованных экземпляров мы имели в виду. В нашем случае замещенным в Array_Sort

экземплярам отдается предпочтение по сравнению с экземплярами, унаследованными из виртуального базового класса через Array_RC (см. раздел 18.5.4). Таким образом, при виртуальном наследовании неквалифицированный вызов find()

разрешается в пользу экземпляра, унаследованного из класса Array_Sort.




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