Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АМП S.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
107.91 Кб
Скачать

Простое наследование

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

class employee

{ public:    employee(char *, char *, float);    void show_employee(void); private:    char name[64];    char position[64];    float salary; };

Далее предположим, что вашей программе требуется класс manager, который добавляет следующие элементы данных в класс employee:

float annual_bonus; char company_car[64]; int stock_options;

В данном случае ваша программа может выбрать два варианта: во-первых, программа может создать новый класс manager, который дублирует многие элементы класса employee, или программа может породить класс типа manager из базового класса employee. Порождая класс manager из существующего класса employee, вы снижаете объем требуемого программирования и исключаете дублирование кода внутри вашей программы.

Для определения этого класса вы должны указать ключевое слово class, имя manager, следующее за ним двоеточие и имя employee, как показано ниже:

Производныйкласс //----->class manager:public employee { <-------// Базовыйкласс

// Здесь определяются элементы };

Ключевое слово public, которое предваряет имя класса employee, указывает, что общие (public) элементы класса employee также являются общими и в классе manager. Например, следующиеоператорыпорождаюткласс manager.

class manager : public employee

{ public:    manager(char *, char *, char *, float, float, int);    void show_manager(void); private:    float annual_bonus;    char company_car[64];    int stock_options; };

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

Следующая программа MGR_EMP.CPP иллюстрирует использование наследования в C++ , создавая класс manager из базового класса employee:

#include <iostream.h>

#include <string.h>

class employee

{ public:    employee(char *, char *, float);    void show_employee(void); private:    char name [ 64 ];    char position[64];    float salary; };

employee::employee(char *name, char *position,float salary)

{    strcpy(employee::name, name);    strcpy(employee::position, position);    employee::salary = salary; }

void employee::show_employee(void)

{    cout<< "Имя: " << name << endl;    cout << "Должность: " << position << endl;    cout << "Оклад: $" << salary << endl; }

class manager : public employee

{ public:    manager(char *, char *, char *, float, float, int);    void show_manager(void); private:    float annual_bonus;    char company_car[64];    int stock_options; };

manager::manager(char *name, char *position, char *company_car, float salary, float bonus, int stock_options) : employee(name, position, salary)

{    strcpy(manager::company_car, company_car) ;    manager::annual_bonus = bonus ;    manager::stock_options = stock_options; }

void manager::show_manager(void)

{    show_employee();    cout << "Машинафирмы: " << company_car << endl;    cout << "Ежегоднаяпремия: $" << annual_bonus << endl;    cout << "Фондовыйопцион: " << stock_options << endl; }

void main(void)

{    employee worker("ДжонДой", "Программист", 35000);    manager boss("ДжейнДой", "Вице-президент ", "Lexus", 50000.0, 5000, 1000);    worker.show_employee() ;    boss.show_manager(); }

Как видите, программа определяет базовый класс employee, а затем определяет производный класс manager. Обратите внимание на конструктор manager. Когда вы порождаете класс из базового класса, конструктор производного класса должен вызвать конструктор базового класса. Чтобы вызвать конструктор базового класса, поместите двоеточие сразу же после конструктора производного класса, а затем укажите имя конструктора базового класса с требуемыми параметрами:

manager::manager(char *name, char *position, char *company_car, float salary, float bonus, int stock_options) : employee(name, position, salary) //————————————— Конструкторбазовогокласса

{ strcpy(manager::company_car, company_car); manager::annual_bonus = bonus; manager::stock_options = stock_options; }

Также обратите внимание, что функция show_manager вызывает функцию show_employee, которая является элементом класса employee. Поскольку класс manager является производным класса employee, класс manager может обращаться к общим элементам класса employee, как если бы все эти элементы были определены внутри класса manager,

Представление о наследовании

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

Второй пример

Предположим, например, что вы используете следующий базовый класс book внутри существующей программы:

class book

{ public:    book (char *, char *, int);    void show_book(void); private:    char title[64];    char author[б 4];    int pages; };

Далее предположим, что программе требуется создать класс library_card, который будет добавлять следующие элементы данных в класс book:

char catalog[64]; int checked_out; // 1, еслипроверена, иначеО

Ваша программа может использовать наследование, чтобы породить класс library _card из класса book, как показано ниже:

class library_card : public book

{ public:    library_card(char *, char *, int, char *, int);    void show_card(void); private:    char catalog[64] ;    int checked_out; };

Следующаяпрограмма BOOKCARD.CPP порождаеткласс library_card изклacca book:

#include <iostream.h>

#include <string.h>

class book

{ public:    book(char *, char *, int);    void show_book(void); private:    char title [64];    char author[64];    int pages; };

book::book(char •title, char *author, int pages)

{    strcpy(book::title, title);    strcpy(book::author, author);    book::pages = pages; }

void book::show_book(void)

{    cout<< "Название: " << title << endl;    cout << "Автор: " << author << endl;    cout << "Страниц: " << pages << endl; }

class library_card : public book

{ public:    library_card(char *, char *, int, char *, int);    void show_card(void) ; private:    char catalog[64];    int checked_out; };

library_card::library_card(char *title, char *author, int pages, char *catalog, int checked_out) : book(title, author, pages)

{    strcpy(library_card::catalog, catalog) ;    library_card::checked_out = checked_out; }

void 1ibrary_card::show_card(void)

{    show_book() ;    cout << "Каталог: " << catalog << endl;    if (checked_out) cout << "Статус: проверена" << endl;    else cout << "Статус: свободна" << endl; }

void main(void)

{    library_card card( "Учимсяпрограммироватьнаязыке C++", "Jamsa", 272, "101СРР", 1);    card.show_card(); }

Как и ранее, обратите внимание, что конструктор library _card вызывает конструктор класса book для инициализации элементов класса book. Кроме того, обратите внимание на использование функции-элемента show_book класса book внутри функции show_card. Поскольку класс library_card наследует методы класса book, функция show_card может вызвать этот метод (show_book) без помощи оператора точки, как если бы этот метод был методом класса library _card.