Главная страница
Навигация по странице:

  • Виртуальные методы

  • Курс ООП в С презентация. ООП в с++(полный курс). Объекты и классы


    Скачать 1.76 Mb.
    НазваниеОбъекты и классы
    АнкорКурс ООП в С презентация
    Дата21.02.2022
    Размер1.76 Mb.
    Формат файлаppt
    Имя файлаООП в с++(полный курс).ppt
    ТипДокументы
    #368655
    страница12 из 26
    1   ...   8   9   10   11   12   13   14   15   ...   26

    Виртуальные методы


    Рекомендуется делать виртуальными деструкторыдля того, чтобы гарантировать правильное освобождение памяти из-под динамического объекта, поскольку в этом случае в любой момент времени будет выбран деструктор, соответствующий фактическому типу объекта.
    Четкого правила, по которому метод следует делать виртуальным, не существует. Можно дать рекомендацию объявлять виртуальными методы, для которых есть вероятность, что они будут переопределены в производных классах.
    Методы, 1) которые во всей иерархии останутся неизменными 2) которыми производные классы пользоваться не будут, делать виртуальными нет смысла.
    С другой стороны, при проектировании иерархии не всегда можно предсказать, каким образом будут расширяться базовые классы, а объявление метода виртуальным обеспечивает гибкость и возможность расширения.
    Виртуальный механизм работает только при использовании указателей или ссылок на объекты. Объект, определенный через указатель или ссылку и содержащий виртуальные методы, называется полиморфным.
      В данном случае полиморфизм состоит в том, что с помощью одного и того же обращения к методу выполняются различные действия в зависимости от типа, на который ссылается указатель в каждый момент времени.

    Виртуальные методы


    Абстрактные классы
    Абстрактным классом называется класс, в котором есть хотя бы одна чистая виртуальная функция. Чистой виртуальной функцией называется функция, которая имеет определение:
    virtual тип имя_функции (список_формальных_параметров) = 0;
    Чисто виртуальный метод должен переопределяться в производном классе (возможно опять как чисто виртуальный).
    Класс, содержащий хотя бы один чисто виртуальный метод, называется абстрактным. Абстрактные классы предназначены для представления общих понятий, которые предполагается конкретизировать в производных классах. Абстрактный класс может использоваться только в качестве базового для других классов. Объекты абстрактного класса создавать нельзя
    При определении абстрактного класса необходимо иметь в виду следующее:

    Виртуальные методы


    Ключи доступа при наследовании
    При описании класса в его заголовке перечисляются все классы, являющиеся для него базовыми. Возможность обращения к элементам этих классов регулируется с помощью ключей доступа private, protected и public:
      class имя : [private | protected | public] базовый_класс
      {тело класса};

      Если базовых классов несколько, они перечисляются через запятую. Ключ доступа может стоять перед каждым классом.

      class A {...};
      class В {...};
      class С {...};
      class D: A, protected В, public С { ... };

      По умолчанию для классов используется ключ доступа private, а для структур — publiс.
      Кроме этого, доступность в производном классе регулируется ключом доступа к базовому классу. Этот ключ указывается в объявлении производного класса и определяет вид наследования: public, private или protected.

    Виртуальные методы


    Открытое наследование сохраняет статус доступа для всех элементов базового класса
    Защищенное – понижает статус доступа всех элементов базового класса со статусом public до protected
    Закрытое – понижает статусы доступа всех элементов базового класса со статусом public и protected до private.
    Производные классы наследуют элементы базового класса person, но некоторые функции будут выполняться в каждом классе по-своему. Например, функция show() будет для каждого класса выводить его собственные поля. Для вызова метода предка из потомка используется операция доступа к области видимости "::".

    Виртуальные методы


    Множественное наследование
    Множественное наследование означает, что класс имеет несколько базовых классов. Если в базовых классах есть одноименные методы, то может произойти конфликт идентификаторов, который устраняется при помощи операции доступа к области видимости ::. В иерархию, представленную на рис. 12, добавим класс employee_student (сотрудники, которые учатся).
    class employee_student: public employee, public student
    {...};
    employee_student A;
    cout< cout< Если у базовых классов есть общий предок (person в примере), то производный класс унаследует два экземпляра поля предка, а это чаще всего нежелательно. Для вызова метода get_age() требуется явно указывать классы, в которых эти методы описаны, иначе компилятор не сможет разобраться к методу какого из базовых классов надо обратиться.

    1   ...   8   9   10   11   12   13   14   15   ...   26


    написать администратору сайта