Наследование классов — позволяет создавать производные классы (классы наследники), взяв за основу все методы и элементы базового класса (класса родителя).
#include using namespace std;class FirstClass    // базовый класс{protected:          // спецификатор доступа к элементу value    int value;public:    FirstClass()    {        value = 0;    }    FirstClass( int input )    {        value = input;    }    void show_value()    {        cout << value << endl;    }};class SecondClass : public FirstClass   // производный класс{public:    SecondClass() : FirstClass ()   // конструктор класса SecondClass вызывает конструктор класса FirstClass    {}    SecondClass(int inputS) : FirstClass (inputS)   // inputS передается в конструктор с параметром класса FirstClass    {}    void ValueSqr () // возводит value в квадрат.Без спецификатора доступа protected эта функция не могла бы изменить значение value    {        value *= value;        }  };int main(){    setlocale(LC_ALL, "rus");    FirstClass F_object(3);     // объект базового класса    cout << "value F_object = ";    F_object.show_value();    SecondClass S_object(4);    // объект производного класса    cout << "value S_object = ";    S_object.show_value();  // вызов метода базового класса    S_object.ValueSqr();        // возводим value в квадрат    cout << "квадрат value S_object = ";    S_object.show_value();    //F_object.ValueSqr();      // базовый класс не имеет доступа к методам производного класса    cout << endl;    return 0;}- Наследование — это определение производного класса, который может обращаться ко всем элементам и методам базового класса за исключением тех, которые находятся в поле private;
- Синтаксис определения производного класса:
- class Имя_Производного_Класса : спецификатор доступа Имя_Базового_Класса { /*код*/ } ;
- Производный класс имеет доступ ко всем элементам и методам базового класса, а базовый класс может использовать только свои собственные элементы и методы.
- В производном классе необходимо явно определять свои конструкторы, деструкторы и перегруженные операторы присваивания из-за того, что они не наследуются от базового класса. Но их можно вызвать явным образом при определении конструктора, деструктора или перегрузки оператора присваивания производного класса, например таким образом (для конструктора): Конструктор_Производного_Класса (/*параметры*/) : Конструктор_Базового_Класса ( /*параметры*/) { } .
- Еще один важный момент при наследовании — перегруженные функции-методы  класса потомка. Если в  классе родителе и в его классах потомках встречаются методы с одинаковым именем, то для объектов  класса потомка компилятор будет использовать методы именно класса потомка. Перегруженные методы класса потомка, могут вызывать методы класса родителя. В таком случае важно помнить, что необходимо правильно определить область действия с помощью оператора ::.Иначе компилятор воспримет это, как вызов функцией самой себя. Наглядно, если бы мы перегрузили в классеSecondClassфункциюshow_value()— это выглядело бы так:
| 1 2 3 4 5 | voidshow_value(){    if(value != 0)        FirstClass :: show_value();} | 
 Эта запись указывает компилятору  — если значение value не равно нулю — вызвать метод show_value() класса FirstClass. А он в свою очередь, отобразит это значение на экране.

 
  
                                    	
                        