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

  • Теоретические сведения

  • Задание к лабораторной работе Общая постановка. Программа должна содержать: базовый класс Х, включающий два элемента х1, х2

  • Лаба по программированию. Лабораторная работа 6 Наследование классов, механизм виртуальных функций


    Скачать 49.5 Kb.
    НазваниеЛабораторная работа 6 Наследование классов, механизм виртуальных функций
    АнкорЛаба по программированию
    Дата15.04.2022
    Размер49.5 Kb.
    Формат файлаdoc
    Имя файлаLaboratornaya_rabota_4_(C++).doc
    ТипЛабораторная работа
    #475308

    Лабораторная работа № 6
    Наследование классов, механизм виртуальных функций


    Цель работы – изучить одну из базовых концепций ООП – наследование классов в С++, заключающуюся в построении цепочек классов, связанных иерархически. Познакомиться с механизмом виртуальных функций.

    Теоретические сведения

    Наследование - механизм создания производного  класса из базового. Т.е., к существующему классу можно что-либо добавить, или изменять его каким-либо образом для создания нового (производного) класса. Это мощный механизм для повторного использования кода. Наследование позволяет создавать иерархию связанных типов, совместно использующих код и интерфейс. Модификатор прав доступа используется для изменения доступа к наследуемым объектам в соответствии с правилами, указанными в таблице 1.

    Таблица 1 – Доступ в классах при наследовании

    Доступ в базовом классе

    Модификатор прав доступа

    Доступ в производном классе

    private

    private

    не доступны

    private

    public

    не доступны

    protected

    private

    private

    protected

    public

    protected

    public

    private

    private

    public

    public

    public

    Ограничение на наследование

    При определении производного класса не наследуются из базового:

    1. конструкторы;

    2. деструкторы;

    3. операторы new, определенные пользователем;

    4. операторы присвоения, определенные пользователем;

    5. отношения дружественности.

    Использование косвенной адресации с установкой указателей на базовый класс. Механизм косвенной адресации рассмотрим на примере:

    class B
    {
    public:
    int x;
    B() {            // Конструктор по умолчанию
    x = 4; }
    };
    class D : public B {      // Производный класс
    public:
    int y;
    D()
    {            // Конструктор по умолчанию
    y = 5; }
    };
    void main(void)  {
    D  d;// Конструктор класса D создает объект d
    B *p; // Указатель установлен на базовый касс
    p = &d;// Указатель p инициализируется адресом d
    // косвенное обращение к объектам базового и производного классов
    // «считываем их текущее состояние в переменные
    int i = p -> x;  // Базовый класс виден напрямую
    int j = ( ( D* ) p )p -> y;// Прямое преобразование указателя на D
    // через переменные печатаем их текущее состояние
    cout << “ x_i= “ << i << endl;   
    cout << “ y_j= “ << j << endl;   
    getch();
    }

    Виртуальная функция и механизм позднего связывания

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

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

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

    С++ поддерживает virtual функции-методы, которые объявлены в основном классе и переопределены в порожденном классе. Иерархия классов, определенная общим наследованием, создает связанный набор типов пользователя, на которые можно ссылаться с помощью указателя базового класса. При обращении к виртуальной функции через этот указатель в С++ выбирается соответствующее функциональное определение во время выполнения. Объект, на который указывается, должен содержать в себе информацию о типе, поскольку различия между ними может быть сделано динамически. Это особенность типична для ООП кода. Каждый объект “знает” как на него должны воздействовать. Эта форма полиморфизма называется чистым полиморфизмом.

    В С++ функции-методы класса с различным числом и типом параметров есть действительно различные функции, даже если они имеют одно и тоже имя. Виртуальные функции позволяют переопределять в управляемом классе функции, введенные в базовом классе, даже если число и тип аргументов то же самое. Для виртуальных функций нельзя переопределять тип функции.

    Задание к лабораторной работе

    Общая постановка. Программа должна содержать:

    • базовый класс Х, включающий два  элемента х1, х2 типа int,

    • конструктор с параметрами для создания объектов в динамической области памяти,

    • деструктор,

    • производный класс Y, включающий один элемент у типа int ,

    • конструктор с параметрами и списком инициализаторов, передающий данные конструктору базового класса,

    Варианты заданий

    Создать как виртуальную функцию и затем определить в производном классе метод Run, вычисляющий:

    1. Сумму компонент базового и производного классов

    2. Произведение компонент базового и производного классов

    3. Сумму квадратов компонент базового и производного классов

    4. Значение х1+х2 – у

    5. Значение (х1+х2)/у

    6. Значение (х1+х2) * у

    7. Значение х1*у+х2

    8. Значение х1+х2*у

    9. Произведение квадратов компонент базового и производного класса

    10. Значение х1*х2+у

    11. Значение х1*х2/у

    12. Значение х1*х2-у

    13. Значение (x1-x2) * y

    14. Значение (x1-x2)/y

    15. Значение х1 * х2 – у

    16. Значение (х1+х2) * 5у

    17. Значение (х1-2*х2) / у

    18. Значение х1/у+х2*y

    19. Значение х1-х2*у

    20. Значение y*х2+x1

    21. Значение х1*х2/(2у)

    22. Значение х1*х2-3*у

    23. Значение (x1-x2) * y*x1

    24. Значение (x1-x2)/(y*x2)

    25. Значение х1-2*(х2 – у)

    26. Значение (х1+х2)/(у*x2)

    27. Значение (х1+х2) * (у-x1)

    28. Значение х1*у+х2/y

    29. Значение х1/y+х2*у

    30. Значение х1*х2+у/(x1*x2)

    31. Значение х1*y/x2

    32. Значение y-х1*х2

    33. Значение (x1-x2) * y/2

    34. Значение (x1-3*x2)/y

    35. Значение х1*х2+2*у/x1

    36. Значение х1*х2+у*y*y


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