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




Объектно-ориентированный подход - часть 4


Вот как выглядит модифицированное описание класса IntArray:

class IntArray {

public:

  // конструкторы

  explicit IntArray (int sz = DefaultArraySize);

  IntArray (int *array, int array_size);

  IntArray (const IntArray &rhs);

  // виртуальный деструктор

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

  // операции сравнения:

  bool operator== (const IntArray&) const;

  bool operator!= (const IntArray&) const;

  // операция присваивания:

  IntArray& operator= (const IntArray&);

  int size() const { return _size; };

  // мы убрали проверку индекса...

  virtual int& operator[](int index)

       { return ia[index]; }

  virtual void sort();

  virtual int min() const;

  virtual int max() const;

  virtual int find (int value) const;

protected:

  static const int DefaultArraySize = 12;

  void init (int sz; int *array);

  int _size;

  int *ia;

}

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

Нужно решить, какие из членов, ранее объявленных как закрытые, сделать защищенными. Для нашего класса IntArray сделаем защищенными все оставшиеся члены.

Теперь нам необходимо определить, реализация каких функций-членов базового класса может меняться в подклассах. Такие функции мы объявим виртуальными. Как уже отмечалось выше, реализация операции взятия индекса будет отличаться по крайней мере для подкласса IntArrayRC. Реализация операторов сравнения и функции size() одинакова для всех подклассов, следовательно, они не будут виртуальными.

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




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