Наследование позволяет строить иерархии, в которых производные классы получают элементы родительского (родительских) или базового классов и могут дополнять или изменять его свойства. Классы, находящиеся ближе к началу иерархии объединяют в себе наиболее общие черты для всех нижележащих классов. По мере продвижения вниз иерархии, классы приобретают все более индивидуальные черты. Множественное наследование позволяет одному классу обладать свойствами многих родительских. Причем любой класс может быть объявлен потомком ранее описанного класса.
Доступ к полям, описанным в классе родителя осуществляется так же, как в собственном. Поиск метода в иерархии класса выполняется следующим образом:
  1. в первую очередь компилятор устанавливает тип объекта
  2. ищет метод в классе объекта, если находит, то подключает его
  3. если метод в классе объекта не найден, то идет поиск в классе родителя. В случае успеха вызывается метод класса родителя. Если метод в классе родителя не найден, то поиск продолжается в классе предков до тех пор пока метод не будет найден
  4. если метод не найден, выдается ошибка
Механизм наследования обеспечивает создание дерева родственных классов. Дерево может иметь несколько уровней, причем на каждом из них могут добавляться новые поля и методы.
Ключи доступа при наследовании
При описании класса в его заголовке перечисляются все классы, являющиеся для него базовыми. Возможность обращения к элементам этих классов регулируется с помощью ключей доступа: private, protected, public.
Пример 1
class name:[private|protected|public] parent_class;

class A{...};
class B{...};
class C{...};
class D:A, protected B, public C {...};
Таблица 1    
Ключ доступаСпецификатор в базовом классеСпецификатор в производном классе
privateprivateno
 protectedprivate
 publicprivate
protectedprivateno
 protectedprotected
 publicprotected
publicprivateno
 protectedprotected
 publicpublic

Private элементы базового класса в производном классе недоступны в производном классе независимо от ключа доступа. Обращение к ним может осуществляться только через элементы базового класса.
Protected элементы с ключом private становятся private, в остальных случаях права доступа к ним не изменяются. Если базовый класс наследуется с ключом private, можно выборочно сделать некоторые элементы доступными в производном классе. Для этого их необходимо объявить в секции public производного класса с помощью оператора доступа к области видимости (::).
Пример 2
class base
{
...
public: void f();
};

class derived:private base
{
...
public: base::void f();
};
Для различных методов класса при использовании механизма наследования существуют разные правила наследования. Конструкторы и операторы присваивания в производном классе не наследуются. Операторы инкрементации и декрементации – наследуются.
Пример 3
Пример простого наследования

class queue
{
protected:
int q[10];
int  sloc, rloc;
public:
void init(void);
void qput(init i);
int qget(void);
};

class queue1:public queue
{
int  sum;
public:

int get_sum(void);

void show_sum(void);

};

/* копирование функций-членов класса queue */
voi queue::init(void) 
{

rloc=sloc=0;
}

int queue::qget(void)
{
if(sloac==rloc)
{
cout<< "очередь пуста";
return 0; /* необходимо вернуть какое-либо значение */
}
return q[rloc++];
}

void queue::qput(int i)
{
if(sloc==10)
{
cout<< "очередь заполнена";
return;
}
q[sloc++]=i;
}

/* Описание функций - членов класса queue 1*/
int queue1::get_sum(void) 
{
sum=0;
for(int i = rloc; i<sloc; i++)

sum+=q[i];
return sum;
}

void queue1::show_sum(void)
{
cout<<"Сумма очереди - "<<sum<<endl;
}

main(void)
{
queue1 obj;
obj.init();
for(int i=0; i<5; i++)
{
obj.qput(100+i);
obj.get_sum();
obj.show_sum();
}

for(i=0; i<6; i++)
{
obj.get_sum();
obj.show_sum();
obj.qget();
}

return 0;
}