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