С++ для начинающих



         

Пример множественного виртуального наследования * - часть 2


    class Derived : public Base<Type> {};

Такая запись неправильна:

// ошибка: Base - это шаблон,

// так что должны быть заданы его аргументы

template < class Type >

    class Derived : public Base {};

В следующем разделе шаблон Array, определенный в главе 16, выступает в роли виртуального базового класса для подтипа Array, контролирующего выход за границы массива; для отсортированного подтипа Array; для подтипа Array, который обладает обоими указанными свойствами. Однако первоначальное определение шаблона класса Array для наследования не подходит:

  • все его члены и вспомогательные функции объявлены закрытыми, а не защищенными;
  • ни одна из зависящих от типа функций-членов, скажем оператор взятия индекса, не объявлена виртуальной.
  • Означает ли это, что наша первоначальная реализация была неправильной? Нет. Она была верной на том уровне понимания, которым мы тогда обладали. При реализации шаблона класса Array мы еще не осознали необходимость специализированных подтипов. Теперь, однако, определение шаблона придется изменить так (реализации функций-членов при этом останутся теми же):

    #ifndef ARRAY_H

    #define ARRAY_H

    #include <iostream>

    // необходимо для опережающего объявления operator<<

    template <class Type> class Array;

    template <class Type> ostream&

              operator<<( ostream &, Array<Type> & );

    template <class Type>

    class Array {

       static const int ArraySize = 12;

    public:

        explicit Array( int sz = ArraySize ) { init( 0, sz ); }

        Array( const Type *ar, int sz )      { init( ar, sz ); }

        Array( const Array &iA )     { init( iA.ia, iA.size()); }

        virtual ~Array()             { delete[] ia; }

        Array& operator=( const Array & );

        int size() const { return _size; }

        virtual void grow();

        virtual void print( ostream& = cout );

        Type at( int ix ) const { return ia[ ix ]; }

        virtual Type& operator[]( int ix ) { return ia[ix]; }




    Содержание  Назад  Вперед