Наследование - это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов. Применение иерархии классов делает управляемыми большие потоки информации. Когда один класс наследуется другим, класс который наследуется, называется базовым классом. Наследующий класс называется производным классом. Обычно процесс наследования начинается с задания базового класса. Базовый класс определяет все те качества, которые будут общими для всех производных классов. Рассмотрим пример:
class base { // Задание базового класса
int i;
public:
void set_i(int n);
int get_i();
};
class derived: public base { // Задание производного класса
int j;
public:
void set_j(int n);
int mul();
};
void base ::set_i(int n)
{ i = n; } // Установка значения i в базовом классе
int base::get_i()
{ return i; } // Возврат значения i в базовом классе
void derived::set_j(int n)
{ j = n; } // Установка значения j в производном классе
int derived::mul()
{ return j * get_i(); } // Вызов значения i из base и, одновременно, j из derived
main()
{
derived ob;
ob.set_i(10); // загрузка i в base
ob.set_j(4); // загрузка j в derived
cout << ob.mul(); // вывод числа 40
return 0;
}
Отметим, что функция get_i(), которая является членом базового класса, а не производного, вызывается внутри производного класса без какой бы то ни было связи с каким-либо объектом. Это возможно потому, что открытые члены класса base становятся открытыми членами derived.
В функции mul(), вместо прямого доступа к i, необходимо вызывать get_i() из-за того, что закрытые члены базового класса, в данном случае i, остаются закрытыми и недоступными для любого производного класса. Причина, по которой закрытые члены становятся недоступными для производных классов - поддержка инкапсуляции.